Если вас интересует только замена символов, вы можете взглянуть на утилиту tr
(что означает «перевод»). Например, чтобы преобразовать символы новой строки в пробелы, вы можете использовать:
tr '\n' ' ' < your_input_file
Аналогично, чтобы перевести пробелы в новые строки, используйте:
tr ' ' '\n' < your_input_file
Обратите внимание, что tr
читает из stdin
, поэтому вам нужно либо использовать перенаправление ввода ( <
), как я сделал в этих примерах, или перенаправить туда свой ввод (используя |
).
Если вы хотите добавить одну и ту же текстовую строку в конце строки для сценарии (символы для поиска: 'X' 'Y'), то вы можете сделать это следующим образом:
sed -e 's/[XY].*/&__ADDEDTEXT__/' yourfile
С другой стороны, если вы хотите, чтобы отдельные тексты помещались в конце строк в зависимости от символа, вы можете сделать :
sed -e '
/X/s/$/__TEXT1__/; t
/Y/s/$/__TEXT2__/
' yourfile
Где мы используем команду t
(читается как тест), чтобы определить, была ли предыдущая команда s///
успешной, и перейти к концу кода sed на настоящая линия. Также обратите внимание на синтаксис: /regex/s/// => если строка содержит регулярное выражение, выполните замену в строке.
Это все 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
при необходимости.
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.