从 Linux 中查找和替换特定文件中的单词和特殊字符



我有一些多个 gnuplot 文件,我希望找到并将"设置 xrange [0:20]"替换为"设置 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

但它的效果并不好。

我认为我的命令在特殊字符转义或文件选择方面是错误的,但不确定如何解决这个问题。需要一些帮助。

谢谢

您有额外的反斜杠来转义特殊字符。请尝试:

# 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中,字符$.*[^需要用反斜杠转义才能被视为文字。

[编辑]
右方括号"]"通常不是正则表达式中的特殊字符,并且您不必将其删除:

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

最新更新