Как сопоставить шаблон с помощью sed и вывести в файл различий

Другой способ справиться с этим — просто использовать NUL -с разделителямиprintfследующим образом:

rsync -0 --include-from=<(printf 'p4.%d\0' {42..67}).

0
07.11.2019, 09:56
1 ответ

Есть несколько возможных способов добиться желаемого. Предполагая, что ваш входной файл называется input.txt, а ваш выходной файл -образно -output.txt, следующее должно работать:

1. Подход с использованием awkиcut

awk '/^-/' input.txt | cut -d "," -f 2-  > output.txt

Это указывает awkсопоставлять каждую строку input.txt, которая начинается с -, и печатать совпадающую строку (это действие по умолчанию, поэтому его не нужно указывать явно )в стандартный вывод.

Это передается в качестве входных данных в cut, который разделяет строки по каждой запятой(-d ",")и печатает все поля, идентифицированные таким образом, но начиная с второго (-f 2-), таким образом опуская начальный -, который вы хотите избавиться.

Затем вывод перенаправляется в файл.

Если вам интересно, вы можете найти дополнительную информацию в GNU Awk User's Guide .

2. Подход с использованием grepиcut

В этой довольно «простой» настройке вы также могли бы использовать grepвместо awk с аналогичным эффектом:

grep "^-" input.txt | cut -d "," -f 2- > output.txt

Регулярное выражение, которое нужно использовать, такое же, как :соответствует -, но только если оно появляется в качестве первого символа строки (это значение предшествующего^).

3. Подход с использованиемsed

Наконец, вы также можете использовать sedдля достижения этого

sed -e "/^[^-]/d" -e "s/^-,//" input.txt > output.txt

Это указывает sedна обработку input.txtс использованием двух правил.

  • Во-первых, удалите из ввода все файлы , а не , начиная с -в начале :Первый ^по-прежнему означает, что следующий символ должен отображаться в качестве первого символа в строке, но в выражении в [... ]это означает «все, кроме a -». Если такая строка будет найдена, она будет удалена (не волнуйтесь,sedне затрагивает ваш входной файл, если вы не укажете опцию -i).
  • Во-вторых, во всех входных строках замените(s/.../.../)ведущий -,на... ничего (и, следовательно, удалите его ).

Вывод снова перенаправляется в файл.

Как указал @Sundeep, это также можно превратить в более компактное единое правило, заявив

sed -n 's/^-,//p' input.txt > output.txt

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

1
28.01.2020, 02:39

Теги

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