Шаблон замены 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