unix - shell正则表达式 - 使用sed解释为固定字符串/文字而不是正则表达式




shell正则匹配数字 (4)

你应该使用replace而不是sed

从手册页:

   The replace utility program changes strings in place in files or on the
   standard input.

   Invoke replace in one of the following ways:

       shell> replace from to [from to] ... -- file_name [file_name] ...
       shell> replace from to [from to] ... < file_name

   from represents a string to look for and to represents its replacement.
   There can be one or more pairs of strings.

对于grep有一个固定的字符串选项, -Ffgrep )来关闭搜索字符串的正则表达式解释。 是否有类似的sed设施? 我在这个男人身上找不到任何东西。 另一个gnu / linux工具的推荐也没关系。

我正在使用sed进行查找和替换功能: sed -i "s/abc/def/g"


你必须使用sed吗? 如果您正在编写bash脚本,则可以执行此操作

#!/bin/bash
pattern='abc'
replace='def'
file=/path/to/file
tmpfile="${TMPDIR:-/tmp}/$( basename "$file" ).$$"
while read -r line
do
  echo ${line/$pattern/$replace}
done < "$file" > "$tmpfile" && mv "$tmpfile" "$file"

使用较旧的Bourne shell(例如ksh88或POSIX sh),你可能没有那么酷的${var/pattern/replace}结构,但你确实有${var#pattern}${var%pattern} ,这可以用于拆分字符串,然后重新组装它。 如果你需要这样做,你需要更多的代码 - 但它真的不是太糟糕。

如果你已经不在shell脚本中,你可以很容易地创建模式,替换和文件名参数,然后调用它。 :)

PS - $ {TMPDIR: - / tmp}结构使用$ TMPDIR(如果在您的环境中设置),或者如果未设置变量则使用/ tmp。 我喜欢在文件名的末尾粘贴当前进程的pid,希望它稍微有点独特。 您可能应该在“真实世界”中使用mktemp或类似的东西,但这可以用于快速示例,并且mktemp二进制文件并不总是可用。


如果您不反对Ruby或长线,您可以使用:

alias replace='ruby -e "File.write(ARGV[0], File.read(ARGV[0]).gsub(ARGV[1], ARGV[2]))"'

replace test3.txt abc def

这会将整个文件加载到内存中,执行替换并将其保存回磁盘。 应该不应该用于大量文件。


选项1)转义正则表达式字符。 例如sed 's/\$0\.0/0/g'将用sed 's/\$0\.0/0/g'替换所有出现的$ 0.0。

选项2)将perl -p -e与quotemeta结合使用。 例如perl -p -e 's/\\./,/gi'将替换所有出现的.,

您可以在脚本中使用选项2,如下所示:

SEARCH="C++"
REPLACE="C#"
cat $FILELIST | perl -p -e "s/\\Q$SEARCH\\E/$REPLACE/g" > $NEWLIST




sed