что делает команда sed -e 's/\(~\).*\(~\)// с текстовым файлом?

что делает команда sed -e 's/\(~\).*\(~\)// с текстовым файлом?

что делает команда sed -e 's/\(~\).*\(~\)// с текстовым файлом? Я не понимаю. Я сталкивался с этим в своей работе.

решение1

Команда (если добавить отсутствующую одинарную кавычку в конце) выведет все строки файла на терминал, но если ~в любой строке есть хотя бы два символа (тильда), то бит между первым и последним ~будет удален с помощью команды подстановки ( s) в sed.

Пример:

$ cat file
1 2 3 ~ 4
1~2~3
Here is ~ the last ~ line ~ THE END
$ sed -e 's/\(~\).*\(~\)//' file
1 2 3 ~ 4
13
Here is  THE END

Однако операторы \(и \)не нужны (так как в выражении не используются обратные ссылки), а операторы -eтакже можно опустить (так как выражение только одно), поэтому команда эквивалентна

sed 's/~.*~//' file

Так что это не такделатьничего не делает с самим файлом, но он будет читать и изменять содержимое файла, создавая обработанный текст, который затем можно сохранить в новом файле с перенаправлением ( sed ... >newfile).


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

sed 's/\(~\).*\1//' file

То есть, сопоставьте ~, затем какой-то другой текст, а затем то же самое, что мы сопоставили в первой \(...\)группе (тильда). Но это не экономит на наборе текста и не делает команду более простой для поддержки или понимания, так что это не будет улучшением по сравнению с sed 's/~.*~//' file.

Связанный контент