что делает команда 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
.