Мне нужно удалить несколько строк между , и (, включая оба шаблона, только при первом появлении.

< Сильный > Пример

Test ,

 this 

is the 
deletion 
part 
(
done...

Ожидаемый результат

Test 
done

Я попробовал следующее, используя sed для достижения указанного выше результата, но он просто возвращает все данные файла.

sed 's/,*(//' file

Заранее спасибо.

2
bill_123 5 Сен 2017 в 10:54

4 ответа

Лучший ответ

awk больше подходит здесь:

awk '/,/{p=1; sub(/[ \t]*,.*/, ""); print} !p; /\(/{p=0}' file

Test
done

В качестве альтернативы вы также можете использовать perl:

perl -i -0777 -pe 's/\h*,.*\(//s' file

Или это регулярное выражение с классом отрицанных символов, для которого не требуется модификатор s:

perl -i -0777 -pe 's/\h*,[^(]*\(//' file
2
anubhava 5 Сен 2017 в 16:40

С помощью sed:

sed '/Test/,/done/{//!d;s/ ,$//}' file

/Test/,/done/: от соответствия строки Test до соответствия следующей строки done:

  • //!d удаляет все строки, кроме тех, которые соответствуют адресам (Test , и done)
  • s/ ,$// удаляет первое вхождение , из адреса
1
SLePort 5 Сен 2017 в 13:13
awk '{sub(/ ,|\.../,"")}NR==1;END{print}' file

Test
done
0
Claes Wikner 6 Сен 2017 в 01:43

Это может работать для вас (GNU sed):

sed -z 's/,[^(]*(//g' file

Хлопнуть весь файл в память и глобально заменить любые символы между , и ( ни на что.

0
potong 5 Сен 2017 в 14:56