как использовать регулярное выражение sed для замены строки

#regex #sed

#регулярное выражение #sed

Вопрос:

Я хочу заменить команду журнала в файле и вывести в другой файл

моя команда журнала может быть такой

 log(xxx);
log ( xxx);
 

поэтому я использую следующее

 cat input.txt | sed -e '/s*logs*(.*)/d' > output.txt
 

тем не менее, он также заменяет строку на «логическую».

Что я должен изменить, чтобы оно работало.

Спасибо

Ответ №1:

Это решение «belt-n-braces» может сработать:

 # sed '/<log>s*([^)]*)/d' <<!
> a
> b
> logical(123)
> log(123)
> log ( 123)
> d
> e
> !
a
b
logical(123)
d
e
 

Ответ №2:

Не экранируйте круглые скобки; вы хотите, чтобы они были буквальными. (Кроме того, насколько я знаю, sed не поддерживает сокращение класса символов регулярных выражений.)

 sed -e '/[ t]*log[ t]*(.*)/d' input.txt > output.txt
 

Комментарии:

1. Это не решает проблему; оно все равно будет соответствовать «логическому», потому что вы разрешаете ноль или более пробелов.

2. Извините, да; оно не будет соответствовать «логическому», но оно все равно будет соответствовать «dialog (…)» или «slog (…)».

3. @tripleee: верно, я должен добавить еще один символ.

Ответ №3:

Если вы просто хотите удалить строки только с помощью «log», вы можете использовать grep.

 grep -vw log input.txt >output.txt
 

Или, если вы хотите включить только журнал в виде одного слова (а не, например, slog), за которым следует необязательный пробел перед парой круглых скобок с чем-либо между ними, вы можете использовать egrep:

 egrep -v '<log[ t]*(.*)' input.txt >output.txt