Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 使用sed解释为固定字符串/文字,而不是正则表达式_Unix_Sed - Fatal编程技术网

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-