grep + sed для замены символов, окружающих строку - PullRequest
2 голосов
/ 08 декабря 2010

Я пытаюсь просмотреть всю папку и заменить все вхождения {{text in here}} на %{text in here}

Я проверил другие темы grep + sed, но они обычно имеют отношение к стандартной замене строк;Я хочу сохранить строку без изменений, но замените некоторые символы , окружающие строку (в основном заменяя первую открывающую скобку на % и удаляя вторую закрывающую скобку).

Ответы [ 4 ]

1 голос
/ 08 декабря 2010

Попробуйте регулярное выражение типа s/{{\(.*\)}}/%{\1}/

\ 1 во второй строке заменяется содержимым первой (...) пары

1 голос
/ 08 декабря 2010

Если по какой-то причине вам не нужно использовать sed, Perl почти всегда предпочтителен благодаря более чистому и гораздо более мощному синтаксису регулярных выражений:

find ... | xargs perl -i~ -pe 's/{{(.*?)}}/%{$1}/g'

Кроме того, несмотря на тот факт, что -i~создает резервную копию, я настоятельно рекомендую вам сделать резервную копию всего дерева, прежде чем поиграть с этим.Я не могу сосчитать, сколько раз я стирал работу, дважды выполняя неработающую командную строку.Наиболее распространенной ошибкой является случайное использование -ne вместо -pe, что приводит к удалению всех данных с оригиналов.Повторное выполнение заменяет резервные копии новыми очищенными файлами, оставляя у вас только ощущение погружения в яму живота.

0 голосов
/ 09 мая 2014

Используйте временный символ, чтобы разрешить исключение ([^³]). Предполагается, что внутри нет ³ и ². Почти любой другой символ может быть использован или защищен с помощью первой проверки / замены, но часто не требуется для стандартного контента.

sed -e 's/{{/²/g;s/}}/³/g;s/²\([^³]*\)³/%{\1}/g;s/²/{{/g;s/³/}}/g' YourFile

на KSH / posix sed

echo "{{abc}} def {{ghi}} jkl {{ mno } {{pqr}}" | sed -e 's/{{/²/g;s/}}/³/g;s/²\([^³]*\)³/%{\1}/g;s/²/{{/g;s/³/}}/g'

%{abc} def %{ghi} jkl %{ mno } {{pqr}

обратите внимание на последнее инкапсулированное поведение на {{ mno } {{pqr}}

0 голосов
/ 08 декабря 2010

Будет ли это работать?

sed 's/{{/%{/g;s/}}/}/g' inputfile

или

sed 's/{{\([^}]*\)}}/%{\1}/g' inputfile
...