sed或类似的:不要解释为正则expression式,解释为固定的string/文字

对于grep有一个固定的string选项, -Ffgrep )来closuressearchstring的正则expression式解释。 有没有类似的sed设施? 我找不到这个男人的任何东西。 另一个gnu / linux工具的build议也可以。

我使用sed来查找和replacefunction: sed -i "s/abc/def/g"

你应该使用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. 

你必须使用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二进制文件并不总是可用的。

选项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 

如果你不反对Ruby或长行,你可以使用这个:

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

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

如果你不想逃避你的弦乐,
你可以通过两个步骤达到你的目标:

fgrep你想要替换的行(获得的linenumber)
之后用sed替换这一行。

例如

 #/bin/sh PATTERN='foo*[)*abc' # we need it literal LINENUMBER="$( fgrep -n "$PATTERN" "$FILE" | cut -d':' -f1 )" NEWSTRING='my new string' sed -i "${LINENUMBER}s/.*/$NEWSTRING/" "$FILE"