Заменить первое вхождение соответствующего текста, используя sed / perl / awk - PullRequest
2 голосов
/ 10 января 2020

Я пытался сопоставить первое вхождение текста в строке и удалял его с помощью sed. Но я узнал, что sed является жадным, и он не будет работать для моего случая, и теперь я пытаюсь реализовать то же самое, используя Perl, но он не работает.

cat test.txt
IAM*WRITNG*THIS*TEXT*FOR*SAMPLE*NUMBER*123*345.05*678987*TEST*OF*DATA*WITH*SOME*DUMMY*TEXT*TO*CHECK*WHETHER*IT*WILL*WORK*TEXT*REPEATING

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

IAM*WRITNG*THIS*TO*CHECK*WHETHER*IT*WILL*WORK*TEXT*REPEATING

с SED:

sed -e 's/\(TEXT\*.*\*.*\*.*\*.*\*.*\*678987\).*\(TEXT\*\)/\2/' test.txt

Выход:

IAM*WRITNG*THIS*TEXT*REPEATING

С Perl:

perl -pe 's/\(TEXT\*.*\*.*\*.*\*.*\*.*\*678987\).*?\(TEXT\*\)/\2/' test.txt

Выход:

IAM*WRITNG*THIS*TEXT*FOR*SAMPLE*NUMBER*123*345.05*678987*TEST*OF*DATA*WITH*SOME*DUMMY*TEXT*TO*CHECK*WHETHER*IT*WILL*WORK*TEXT*REPEATING

Может кто-нибудь сообщить мне, в чем заключалась ошибка, которую я делал?

Обновление: я пробовал использовать решение, данное для команды Perl, но оно не работает со строками большей длины. Есть ли способ сделать это с помощью awk?

Ответы [ 3 ]

3 голосов
/ 10 января 2020

Вы можете попробовать следующую команду и посмотреть, соответствует ли она вашим требованиям

perl -pe "s/TEXT.*?TEXT.//" test_1.txt

выход

IAM*WRITNG*THIS*TO*CHECK*WHETHER*IT*WILL*WORK*TEXT*REPEATING

3 голосов
/ 10 января 2020

В отличие от sed, для группировки паттерна в Perl требуется всего пара скобок, а не скобок, которые экранируются обратными косыми чертами:

perl -pe 's/(TEXT\*.*\*.*\*.*\*.*\*.*\*678987).*?(TEXT\*)/$2/' test.txt
0 голосов
/ 10 января 2020

Не могли бы вы попробовать следующее:

perl -pe 's/(TEXT\*.*?678987).*?(?=TEXT\*)//' test.txt
...