Построчное изменение в Unix

Если вас интересует только замена символов, вы можете взглянуть на утилиту tr (что означает «перевод»). Например, чтобы преобразовать символы новой строки в пробелы, вы можете использовать:

tr '\n' ' ' < your_input_file

Аналогично, чтобы перевести пробелы в новые строки, используйте:

tr ' ' '\n' < your_input_file

Обратите внимание, что tr читает из stdin , поэтому вам нужно либо использовать перенаправление ввода ( <), как я сделал в этих примерах, или перенаправить туда свой ввод (используя | ).

3
22.05.2017, 17:07
3 ответа

Если вы хотите добавить одну и ту же текстовую строку в конце строки для сценарии (символы для поиска: 'X' 'Y'), то вы можете сделать это следующим образом:

sed -e 's/[XY].*/&__ADDEDTEXT__/' yourfile

С другой стороны, если вы хотите, чтобы отдельные тексты помещались в конце строк в зависимости от символа, вы можете сделать :

sed -e '
   /X/s/$/__TEXT1__/; t
   /Y/s/$/__TEXT2__/
' yourfile

Где мы используем команду t (читается как тест), чтобы определить, была ли предыдущая команда s/// успешной, и перейти к концу кода sed на настоящая линия. Также обратите внимание на синтаксис: /regex/s/// => если строка содержит регулярное выражение, выполните замену в строке.

2
27.01.2020, 21:12

Это все sedработа, дополнительные инструменты не нужны:

Допустим, вы хотите добавить fooв конце строки, содержащей fи barв конце строк без f, но с b

.
sed '/f/{
  s/$/foo/
  b
  }
/b/s/$/bar/'

Вы можете «адресовать» строки с помощью /pattern/, поэтому следующие команды выполняются только в том случае, если они содержат шаблон. Таким образом, в примере только строки, содержащие f, вызывают выполнение замены s, а командыb{}группируют команды, поэтому все внутри применяется только в том случае, если адрес совпадает. bпереходит в конец скрипта, чтобы избежать добавления другой строки для соответствия b.

Другой подход без разветвления:

sed '/f/s/$/foo/;s/^[^f]*b[^f]*$/&bar/'

В качестве упражнения вы можете понять это самостоятельно, обладая некоторыми sedзнаниями, используя man sedпри необходимости.

6
27.01.2020, 21:12

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

Таким образом, в примере с @Philippos программа на Perl будет выглядеть следующим образом (часть синтаксиса является необязательной и была добавлена ​​для пояснения):

perl -pe '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file

Это считывает fileи выводит результат. Вы также можете «редактировать» файл на месте, используя -pi -eвместо -pe(-i, что означает «на месте» ), поэтому:

perl -pi -e '(m/f/&&s/$/foo/)||(m/b/&&s/$/bar/)' file

Вероятно, есть способ сделать это с помощью awk, хотя первоначальное тестирование мне не удалось (Я не очень хорошо разбираюсь в AWK ), с Ruby (, который выглядит почти так же, отправьте мне сообщение, если хотите нужны примеры ), и это может быть весело в чистом Bash.

0
01.11.2020, 11:56

Теги

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