Как добавить текст в начало и конец текста совпадает с $

Подстановочные знаки раскрываются оболочкой, а не командой. find— одна из немногих команд, выполняющих сопоставление с подстановочными знаками, аналогичное оболочке, в свое время.

Когда вы запускаете ls *.xml, сначала оболочка расширяет *.xmlдо списка соответствующих файлов, например. file1.xmlfile2.xmlfile3.xml, а затем оболочка вызывает lsс результирующим списком аргументов file1.xmlfile2.xmlfile3.xml. Вот почему вы видите тот же список имен файлов с echo *.xml, хотя echoничего не знает о файлах и не заботится о том, являются ли его аргументы именами файлов.

Когда вы бежитеfind. -name "*.xml":

  1. Оболочка анализирует командную строку для распознавания специальных символов и разбивает ее на слова и знаки препинания. Здесь просто список слов find, ., -name, *.xml, где *цитируется. Поскольку *взят в кавычки, это обычный символ с точки зрения оболочки.
  2. Оболочка запускает команду findс указанным списком аргументов :., -name, *.xml.
  3. findищет файлы, имя которых соответствует шаблону *.xmlв любом каталоге в текущем каталоге.

При запуске find. -name *.xmlи отсутствии файлов, соответствующих*.xml:

  1. Оболочка анализирует командную строку для распознавания специальных символов и разбивает ее на слова и знаки препинания. Здесь просто список слов find, ., -name, *.xml, где *не заключено в кавычки.
  2. Поскольку слово *.xmlсодержит подстановочный знак без кавычек, оболочка выполняет генерацию имени файла. Поскольку соответствующих имен файлов нет, шаблон остается нераскрытым.
  3. Оболочка запускает команду findс полученным списком аргументов: ., -name, *.xml.
  4. findищет файлы, имя которых соответствует шаблону *.xmlв любом каталоге в текущем каталоге.

Когда вы запускаете find. -name *.xmlи текущий каталог содержит file1.xml, file2.xmlиfile3.xml:

  1. Оболочка анализирует командную строку для распознавания специальных символов и разбивает ее на слова и знаки препинания. Здесь просто список слов find, ., -name, *.xml, где *не заключено в кавычки.
  2. Поскольку слово *.xmlсодержит подстановочный знак без кавычек, оболочка выполняет генерацию имени файла.:*.xmlзаменяется списком совпадающих имен файлов.
  3. Оболочка запускает команду findс полученным списком аргументов: ., -name, file1.xml, file2.xml, file3.xml.
  4. findжалуется на синтаксическую ошибку, когда достигает file2.xml.

Когда вы запускаете find. -name *.xmlи текущий каталог содержит один соответствующий файлfile.xml:

  1. Оболочка анализирует командную строку для распознавания специальных символов и разбивает ее на слова и знаки препинания. Здесь просто список слов find, ., -name, *.xml, где *не заключено в кавычки.
  2. Поскольку слово *.xmlсодержит подстановочный знак без кавычек, оболочка выполняет генерацию имени файла :*.xml, заменяется списком совпадающих имен файлов.
  3. Оболочка запускает команду findс полученным списком аргументов: ., -name, file.xml.
  4. findвидит вполне допустимую команду, но, вероятно, это не то, что вы хотели.:findсказано искать файлы с именем file.xmlв любом каталоге, а не искать какой-либо файл, соответствующий *.xml.

(Оценка и расширение оболочки имеет множество других функций. Я упомянул только те, которые актуальны здесь.)

(То, что я описываю, является поведением по умолчанию большинства распространенных оболочек :sh, bash, dash, ksh, … Некоторые оболочки могут быть настроены для отображения ошибки вместо запуска команды с нерасширенными подстановочными знаками,или расширить не соответствующие -подстановочные знаки до пустого списка. Ни один из них не поможет здесь.)

-1
17.11.2020, 20:04
2 ответа
$ sed '/^\$/{s/^/start /; s/$/ end/;}' abc.txt
start $ hello end

start $  yes end

r no change
2
18.03.2021, 22:48

другой sedподход:

sed '/^\$/ s/.*/start & end/' infile

в sed, &— это обратная -ссылка на согласованную часть шаблона в s/<pattern>/<replace>/.


с помощью awkвы также можете сделать то же самое:

awk '/^\$/{ $0="start " $0 " end" }1'  infile

в awk, $0представляет текущую запись/строку; записи/строки разделены на основе встроенной в awk переменной -вRS(R запись S разделитель ), по умолчанию \newline; давайте посмотрим некоторые встроенные -значения переменных по умолчанию, которые они устанавливают, когда awk читает запись:

awk -d- '0' <<<'1'

awk состоит из двух частей, condition { action }по крайней мере одна из которых должна присутствовать в команде awk.

наше условие здесь — это шаблон и это/^\$/(начало ^с долларом \$, мы избежали этого, потому что как ^является якорем для начала записи, $является привязкой к концу этой записи ).

в $0="start " $0 " end"мы обновляем запись, добавляя к ней фиксированные строки start и endи записываем обратно в $0.

/pattern/ { action }1, здесь 1на самом деле является всегда истинным условием, которое включает действие печати aek по умолчанию; вместо этого вы можете написать любое условие, которое приводит к истинности и запускает действие печати.

awk '/pattern/ { action }; 1!=0'
awk '/pattern/ { action }3'
...

или используйте само действие print:

awk '/pattern/ { action }; { print }'
4
18.03.2021, 22:48

Теги

Похожие вопросы