регулярное выражение в sed, удаляющее только первое вхождение из каждой строки - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть следующий файл, который я хотел бы очистить

cat file.txt

MNS:N+    GYPA*01 or GYPA*M   
MNS:M+    GYPA*02 or GYPA*N
MNS:Mc    GYPA*08 or GYP*Mc
MNS:Vw    GYPA*09 or GYPA*Vw
MNS:Mg    GYPA*11 or GYPA*Mg
MNS:Vr    GYPA*12 or GYPA*Vr

Мой желаемый результат:

MNS:N+  GYPA*01 or GYPA*M   
MNS:M+  GYPA*02 or GYPA*N
MNS:Mc  GYPA*08 or GYP*Mc
MNS:Vw  GYPA*09 or GYPA*Vw
MNS:Mg  GYPA*11 or GYPA*Mg
MNS:Vr  GYPA*12 or GYPA*Vr

Я бы хотел удалить все между ":" и первым появлением "или"

Я пытался sed 's/MNS:d*?or /MNS:/g', хотя он удаляет также второе "или".

Я пробовал каждый параметр в https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/

безрезультатно. я должен создать alias sed='perl -pe'? Похоже, что sed не поддерживает регулярные выражения

Ответы [ 5 ]

3 голосов
/ 29 февраля 2020

perl здесь должно быть более подходящим, потому что нам нужны ленивые логики совпадений c здесь.

perl -pe 's|(:.*?or +)(.*)|:\2|' Input_file

с помощью .*?or мы проверяем первое ближайшее совпадение или строку в строке .

2 голосов
/ 29 февраля 2020

Wrt I would like to remove everything between ":" and the first occurence of "or" - нет, вы бы не стали. Первое вхождение or во 2-й строке ввода образца является началом orweqqwe. Этот текст сразу после : выглядит так, как будто это может быть любой набор символов, поэтому он не может содержать отдельный or, например, MNS:2 or eqqwe or M+ GYPA*02 or GYPA*N

Учитывая это и тот факт, что это, очевидно, фиксированное количество символов чтобы быть удаленным в каждой строке, кажется, что это то, что вы действительно должны использовать:

$ sed 's/:.\{14\}/:/' file
MNS:N+    GYPA*01 or GYPA*M
MNS:M+    GYPA*02 or GYPA*N
MNS:Mc    GYPA*08 or GYP*Mc
MNS:Vw    GYPA*09 or GYPA*Vw
MNS:Mg    GYPA*11 or GYPA*Mg
MNS:Vr    GYPA*12 or GYPA*Vr
1 голос
/ 29 февраля 2020

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

sed '/:.*\<or\>/{s/\<or\>/\n/;s/:.*\n//}' file

Если строка содержит :, за которым следует слово or, то замените первое вхождение слова or на уникальный разделитель (например, \n), а затем удалите все, что находится между : и уникальным разделителем.

1 голос
/ 29 февраля 2020

ex поддерживает ленивое сопоставление с \{-}:

ex -s '+%s/:\zs.\{-}or //g|wq' input_file

Шаблон :\zs.\{-}or соответствует любому символу после первого : до первого or.

0 голосов
/ 29 февраля 2020

Если вы уверены, что or всегда встречается дважды в строке, как показано в примере, попробуйте:

sed 's/\(MNS:\).\+ or \(.\+ or .*\)/\1\2/' file.txt

Результат:

MNS:N+    GYPA*01 or GYPA*M   
MNS:M+    GYPA*02 or GYPA*N
MNS:Mc    GYPA*08 or GYP*Mc
MNS:Vw    GYPA*09 or GYPA*Vw
MNS:Mg    GYPA*11 or GYPA*Mg
MNS:Vr    GYPA*12 or GYPA*Vr

В противном случае использование perl является лучшее решение, которое поддерживает shortest match, как отвечает RavinderSingh13.

...