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

Eog*_*anM 33 unix sed

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

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

dan*_*uer 9

你必须使用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"
Run Code Online (Sandbox Code Playgroud)

与旧的Bourne shell(如ksh88或POSIX SH),你可能没有冷静${var/pattern/replace}的结构,但你必须${var#pattern}${var%pattern},可用于多达分割字符串,然后再组装起来.如果你需要这样做,你需要更多的代码 - 但它真的不是太糟糕.

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

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

  • echo通常作为shell内置实现,它应该在像bash这样的现代shell上派0进程. (3认同)

Kim*_*ard 5

选项1)转义正则表达式字符。例如,sed 's/\$0\.0/0/g'将所有出现的$ 0.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
Run Code Online (Sandbox Code Playgroud)

  • Perl确实有一个-i参数,该参数与sed -i arg一样。 (2认同)

Bri*_*nts -5

您应该使用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.
Run Code Online (Sandbox Code Playgroud)

  • 由于大多数系统上都没有“/usr/bin/replace”,这对我来说并不是一个通用的答案。 (60认同)
  • 嗯,没有安装“替换” - 它看起来是一个 MySQL 相关工具?我安装了MySql;有单独安装可以替换吗? (7认同)