Найти и заменить слова и специальные символы из определенных файлов из Linux - PullRequest
0 голосов
/ 06 января 2019

У меня есть несколько файлов gnuplot, и я хочу найти и заменить "set xrange [0:20]" на "set xrange [0: 3]" для серии файлов "gnuplot_RTre _ *. Gnplt" в текущем каталоге , Я нашел, как поменять определенные строки из всех файлов из папки, но не только для конкретных файлов, включая специальные символы.

Итак, я попытался

find . -type f -name "gnuplot_RTre_*.gnplt" -exec sed -i 's/set xrange [0:20]/set xrange [0:3]/g' {} +

Это не делает ошибку, но это ничего не меняет из этих файлов. Поэтому я попытался экранировать специальные символы, используя обратную косую черту

find . -type f -name "gnuplot_RTre_*.gnplt" -exec sed -i 's/set xrange \\[\\0\\:\\20\\]\\/set xrange \\[\\0\\:\\3\\]\\/g' {} + 

Все еще не работает, без ошибок, но без обмена.

Я тоже пытался

grep -rl 'set xrange [0:20]' ./ | xargs sed -i 's/set xrange [0:20]/set xrange [0:3]/g' gnuplot_RTre_*.gnplt

Но это тоже не работает.

Я думаю, что мои команды неверны с экранированием специальных символов или выбором файла, но я не уверен, как решить эту проблему. Нужна помощь

Спасибо

1 Ответ

0 голосов
/ 06 января 2019

У вас есть дополнительные обратные слеши, чтобы избежать специальных символов. Пожалуйста, попробуйте:

# find . -type f -name "gnuplot_RTre_*.gnplt" -exec sed -i 's/set xrange \[0:20]/set xrange \[0:3]/g' {} +
# The backslash in the REPLACEMENT above is unnecessary, although harmless.
# Please adopt the following instead.
find . -type f -name "gnuplot_RTre_*.gnplt" -exec sed -i 's/set xrange \[0:20]/set xrange [0:3]/g' {} +

В sed символы $.*[\^ необходимо экранировать с помощью обратной косой черты, чтобы их считали буквальными.

[EDIT]
Правая квадратная скобка "]" обычно не является специальным символом в регулярном выражении и вам не нужно забрасывать это:

echo "[abc]" | sed 's/]/*/g'
=> [abc*

Но "]" ведет себя как метасимвол, если ему предшествует неэкранированная левая квадратная скобка "[" для составления character class.

echo "[abc]abc" | sed 's/[abc]/*/g'
=> [***]***

Чтобы сделать "[" буквальным, нам нужно избежать его.

echo "[abc]abc" | sed 's/\[abc]/*/g'
=> *abc

"]" также можно экранировать только для визуальной симметрии.

echo "[abc]abc" | sed 's/\[abc\]/*/g'
=> *abc
...