Заменить строки текстом с помощью GNU ed - PullRequest
0 голосов
/ 01 ноября 2011

Я хочу заменить %foo% (найден в тесте файла) строкой, содержащей все возможные символы. Из-за ограничения отсутствующих символов следующее невозможно (выполняется в BASHv4):

echo %foo% > test
replacement="//this//is//a//test"
ed -s test <<< "g/%foo%/s/%foo%/$replacement"

Есть идеи, как заменить %foo% каждым возможным текстом?

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Я гарантирую, что вы приблизитесь к своей цели, избежав косой черты и обратной косой черты с предварительно добавленной обратной косой чертой.AFAIK, который нельзя сделать в bash за один шаг, так что вы можете написать функцию, чтобы сделать ее читабельной, или насладиться поездкой в ​​наклонный лес зубочисток:

$ echo %foo% > test
$ replacement="//this//is//a\\\\//test"
$ echo $replacement
//this//is//a\\//test
$ stage1=${replacement//\\/\\\\}
$ echo $stage1
//this//is//a\\\\//test
$ stage2=${stage1//\//\\\/}
$ echo $stage2
\/\/this\/\/is\/\/a\\\\\/\/test
$ ed -s test <<< g/.*foo.*/s/foo/$stage2/p
%//this//is//a\\//test%

Новые строки остаются проблемой,но в любом случае вы не хотите хранить их в переменных окружения bash, поскольку пробелы там не очень стабильны.

0 голосов
/ 04 ноября 2011

С помощью команды r можно загрузить текст из другого файла, поэтому допустимым решением является следующее:

  • сохранить замену в другом файле
  • открыть файл с помощью ed
  • переместить указатель на местоположение
  • удалить строку (ложная замена следует)
  • загрузить текст из файла с r FILE
  • записать и выйти
...