Шаблон замены ed HERELINE не работает

Предположим, вы хотите внести изменения во все файлы, содержащие шаблон. Например, измените все "2017" на "2018". Существует множество предложений для Perl, Sed и множества других. Редактор ed значительно проще, если его можно заставить работать.

Учитывая файл:

$ echo 2017 > fubar

Почему это не работает

$ ed fubar <<< ',s/2017/2018/g\nw\n'
6
?
$ cat fubar
2017
$ 

Когда это произойдет.

$ printf ',s/2017/2018/g\nw\n'|ed fubar
6
7
$ cat fubar
2018
$ 

В конце концов, это будет использоваться в цикле, как это

$ for i in `grep -r -l 2018`; do ed $i <<< ',s/2017/2018/g\nw\n'; done

1 ответ

Решение

printf переводит \n escape-последовательность для символов новой строки. Там нет такого перевода в обычных строках в оболочке, и ed тоже не распознает его, так что это не понято и вы получаете ошибки.

Ты можешь использовать bash$'...' строки для выполнения escape-последовательности перевода.

ed fubar <<< $',s/2017/2018/g\nw\nq\n'

Я также добавил явное q Команда в конце. В моей системе Mac OS я получаю ? предупреждение, если ed читает EOF.

Вы также можете использовать здесь документ:

ed fubar <<EOF
,s/2017/2018/g
w
q
EOF
Другие вопросы по тегам