从 linux 的特定文件中查找并替换单词和特殊字符
Find and replace words and special characters from specific files from linux
我有一些多个 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
但效果不佳。
我认为我的命令在特殊字符转义或文件选择方面有问题,但不确定如何解决这个问题。需要一些帮助。
谢谢
您有额外的反斜杠来转义特殊字符。请尝试:
# 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
我有一些多个 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
但效果不佳。
我认为我的命令在特殊字符转义或文件选择方面有问题,但不确定如何解决这个问题。需要一些帮助。
谢谢
您有额外的反斜杠来转义特殊字符。请尝试:
# 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