Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.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
Linux 如何在sed中替换*_Linux_Sed - Fatal编程技术网

Linux 如何在sed中替换*

Linux 如何在sed中替换*,linux,sed,Linux,Sed,我想用一个数字替换*号 ifile.txt 2 3 4 ***** 3 3 4 ***** 1 2 1 ***** 期望输出 ofile.txt 2 3 4 999 3 3 4 999 1 2 1 999 我在试着用 sed -i 's/*****/999/g' ifile.txt 但不起作用。试试看 sed -i 's/\*\*\*\*\*/999/g' ifile.txt 因为*是RE中最基本的特殊字符之一。请参阅并直接从规范中查看。请尝试 sed -i 's/\*\*\*\*\*/

我想用一个数字替换*号

ifile.txt
2 3 4 *****
3 3 4 *****
1 2 1 *****
期望输出

ofile.txt
2 3 4 999
3 3 4 999
1 2 1 999
我在试着用

sed -i 's/*****/999/g' ifile.txt
但不起作用。

试试看

sed -i 's/\*\*\*\*\*/999/g' ifile.txt
因为*是RE中最基本的特殊字符之一。请参阅并直接从规范中查看。

请尝试

sed -i 's/\*\*\*\*\*/999/g' ifile.txt
因为*是RE中最基本的特殊字符之一。请参阅和直接从规范中参阅。

您需要使用\转义特殊字符*,即:

将匹配1个或多个*\*+并将其替换为999

您需要使用\转义特殊字符*,即:

将匹配1个或多个*\*+并将其替换为不带-r的999

如果您需要将5*完全替换为999。您也可以使用此选项:

sed -r 's/\*+/999/g' ifile.txt
在正则表达式中,+用于匹配一个或多个连续的

在正则表达式中,{n}用于精确匹配

在正则表达式中{n,m}用于匹配

要确保表达式按预期工作,请使用-r,因为标准表达式简化的规则集与unix/linux发行版不同,因此请使用-r确保所有正则表达式规则都将应用,而无需转义+,{,},特殊字符。

如果不使用-r,则无法工作

如果您需要将5*完全替换为999。您也可以使用此选项:

sed -r 's/\*+/999/g' ifile.txt
在正则表达式中,+用于匹配一个或多个连续的

在正则表达式中,{n}用于精确匹配

在正则表达式中{n,m}用于匹配

要确保表达式按预期工作,请使用-r,因为sed标准表达式简化的规则集与unix/linux发行版不同,因此请使用-r确保应用所有正则表达式规则,而不需要转义+,{,},特殊字符

用法:

echo '2 3 4 *****' | awk -f t.awk
awk -f t.awk infile.txt
用法:

echo '2 3 4 *****' | awk -f t.awk
awk -f t.awk infile.txt

你可以用gawk来做这件事。以下代码将第四列中的星号替换为三个9

gawk '{gsub(/*****/,"999",$4)}1' file 
        2 3 4 999
        3 3 4 999
        1 2 1 999

你可以用gawk来做这件事。以下代码将第四列中的星号替换为三个9

gawk '{gsub(/*****/,"999",$4)}1' file 
        2 3 4 999
        3 3 4 999
        1 2 1 999

这似乎是正确的,但如果你能解释它为什么会起作用,那就太好了。例如,sed模式中*的特殊含义是什么,以及如何用反斜杠将其转义。@5gon12eder:因为*是一个特殊字符,是最基本的字符之一。对于以后的阅读和直接从规范中获取的信息,请参见。@5gon12eder如果您要使用sed,您不认为应该从学习正则表达式的工作原理开始吗?www.regular-expression.info上有一个教程。@Barmar我绝对这么认为。正因为如此,我不认为堆栈溢出应该成为那些没有学习正则表达式的人的模式生成器。要么这个问题是值得的,然后应该用解释来回答,要么它是懒惰的,应该被否决并最终关闭。这似乎是正确的,但如果你能解释它为什么有效,那就太好了,例如,sed模式中*的特殊含义是什么,以及如何用反斜杠转义。@5gon12eder:因为*是一个特殊字符,是最基本的字符之一。对于以后的阅读和直接从规范中获取的信息,请参见。@5gon12eder如果您要使用sed,您不认为应该从学习正则表达式的工作原理开始吗?www.regular-expression.info上有一个教程。@Barmar我绝对这么认为。正因为如此,我不认为堆栈溢出应该成为那些没有学习正则表达式的人的模式生成器。要么这个问题是值得的,然后应该用解释来回答它,要么它是懒惰的,应该被否决并最终关闭。为什么有两个\\ inside single quoted'参数?这个解决方案在Ubuntu 15.04上不起作用,因为您需要添加-r来启用扩展规则集。正如我在下面的回答中已经解释的那样,至少对于GNU sed,您必须使用\+来避开+或者使用sed-r。不确定BSD sed。为什么有两个\\inner single quoted'参数?此解决方案在Ubuntu 15.04上不起作用,因为您需要添加-r以启用扩展规则集。正如我在下面的回答中已经解释的那样,至少对于GNU sed,您必须使用\+来避开+或者使用sed-r。不确定BSD sed。两个备注:+不是任何重复次数,而是一个或多个。*是任何数字,包括零。并且-r不是必需的,它只允许您跳过一些特殊字符的转义:sed's/\x.\+\{2,3\}\/y/'相当于sed-r's/x.+{2,3}/y/'。是的,您是对的,但我写这篇文章只是因为上面的解决方案's/\*+/999/g'在没有-r选项的ubuntu上无法工作,但是,如果你最好使用-r,你肯定它能像预期的那样工作是任何数字,包括零。和-r不是必需的,它只是允许
让你跳过一些特殊字符的转义:sed's/\x.\+\{2,3\}\/y/'相当于sed-r的s/x.+{2,3}/y/'。是的,你是对的,但我写这篇文章只是因为上面的解决方案's/\*+/999/g'在ubuntu上没有-r选项时无法工作,但是,如果您作为最佳实践使用-r,您肯定它能按预期工作。请详细说明此代码如何回答问题。请详细说明此代码如何回答问题。