对于grep
有一个固定的string选项, -F
( fgrep
)来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"