Unix 使用sed解释为固定字符串/文字,而不是正则表达式
对于Unix 使用sed解释为固定字符串/文字,而不是正则表达式,unix,sed,Unix,Sed,对于grep有一个固定的字符串选项,-F(fgrep)用于关闭搜索字符串的正则表达式解释。 对于sed,是否有类似的设施?我在这个人身上找不到任何东西。推荐另一个gnu/linux工具也可以 我正在使用sed查找和替换功能:sed-I“s/abc/def/g”选项1)转义regexp字符。例如,sed的/\$0\.0/0/g'将所有出现的$0.0替换为0 选项2)结合使用perl-p-e。例如,perl-p-E's/\\./,/gi'将所有出现的替换为, 您可以在如下脚本中使用选项2: SEAR
grep
有一个固定的字符串选项,-F
(fgrep
)用于关闭搜索字符串的正则表达式解释。
对于sed
,是否有类似的设施?我在这个人身上找不到任何东西。推荐另一个gnu/linux工具也可以
我正在使用sed
查找和替换功能:sed-I“s/abc/def/g”
选项1)转义regexp字符。例如,sed的/\$0\.0/0/g'
将所有出现的$0.0替换为0
选项2)结合使用perl-p-e
。例如,perl-p-E's/\\./,/gi'
将所有出现的
替换为,
您可以在如下脚本中使用选项2:
SEARCH="C++"
REPLACE="C#"
cat $FILELIST | perl -p -e "s/\\Q$SEARCH\\E/$REPLACE/g" > $NEWLIST
选项1)转义regexp字符。例如,sed的/\$0\.0/0/g'
将所有出现的$0.0替换为0
选项2)结合使用perl-p-e
。例如,perl-p-E's/\\./,/gi'
将所有出现的
替换为,
您可以在如下脚本中使用选项2:
SEARCH="C++"
REPLACE="C#"
cat $FILELIST | perl -p -e "s/\\Q$SEARCH\\E/$REPLACE/g" > $NEWLIST
您必须使用
sed
?如果您正在编写bash脚本,您可以
#/bin/bash
模式class='abc'
替换class='def'
file=/path/to/file
tmpfile=“${TMPDIR:-/tmp}/$(basename“$file”)。$$”
而read-r行
做
回显“${line/$pattern/$replace}”
完成<“$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
二进制文件并不总是可用。您必须使用sed
?如果您正在编写bash脚本,您可以
#/bin/bash
模式class='abc'
替换class='def'
file=/path/to/file
tmpfile=“${TMPDIR:-/tmp}/$(basename“$file”)。$$”
而read-r行
做
回显“${line/$pattern/$replace}”
完成<“$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
二进制文件并不总是可用的。您应该使用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.
replace实用程序更改文件中或计算机上的字符串
标准输入。
通过以下方式之一调用replace:
外壳>从替换到[从替换到]…--文件名[文件名]。。。
外壳>从替换到[从替换到]…<文件名
from表示要查找的字符串,to表示其替换。
可以有一对或多对字符串。
您应该使用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.
replace实用程序更改文件中或计算机上的字符串
标准输入。
通过以下方式之一调用replace:
外壳>从替换到[从替换到]…--文件名[文件名]。。。
外壳>从替换到[从替换到]…<文件名
from表示要查找的字符串,to表示其替换。
可以有一对或多对字符串。
如果您不反对Ruby或长线,您可以使用以下方法:
alias replace='ruby -e "File.write(ARGV[0], File.read(ARGV[0]).gsub(ARGV[1]) { ARGV[2] })"'
replace test3.txt abc def
这会将整个文件加载到内存中,执行替换并将其保存回磁盘。不应用于海量文件。如果您不反对Ruby或长线,可以使用以下方法:
alias replace='ruby -e "File.write(ARGV[0], File.read(ARGV[0]).gsub(ARGV[1]) { ARGV[2] })"'
replace test3.txt abc def
这会将整个文件加载到内存中,执行替换并将其保存回磁盘。不应用于海量文件。如果您不想转义字符串,可以通过两个步骤实现目标:
fgrep
要替换的行(获取行号),以及sed
替换此行#/bin/sh
PATTERN='foo*[)*abc'#我们需要它
LINENUMBER=“$(fgrep-n“$PATTERN”“$FILE”| cut-d':'-f1)”
NEWSTRING='my new string'
sed-i“${LINENUMBER}s/*/$NEWSTRING/”$FILE”
如果您不想跳出字符串,您可以通过两个步骤实现目标:
fgrep
要替换的行(获取行号),以及sed
替换此行#/bin/sh
PATTERN='foo*[)*abc'#我们需要它
LINENUMBER=“$(fgrep-