Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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
Regex 用SED替换特定模式_Regex_Linux_Sed - Fatal编程技术网

Regex 用SED替换特定模式

Regex 用SED替换特定模式,regex,linux,sed,Regex,Linux,Sed,我需要关于如何编写SED单行程序(无awk)的帮助,该程序用相同长度的模式替换一行的子字符串。 例如,如果文件看起来像: daemon www X=1 ***Y=1,2,2*** Z= daemon www X=1 ***Y=1,2,2,1,3,4,5*** Z=4 daemon mail a=3 有什么想法吗?谢谢 单向: sed '/daemon www.*Y=/{:l s/\(Y=\(0,\)*\)[0-9]*/\10/;/Y=\(0,\)*0\([^,0-9]\|$\)/!bl}' i

我需要关于如何编写SED单行程序(无awk)的帮助,该程序用相同长度的模式替换一行的子字符串。 例如,如果文件看起来像:

daemon www X=1 ***Y=1,2,2*** Z= daemon www X=1 ***Y=1,2,2,1,3,4,5*** Z=4 daemon mail a=3 有什么想法吗?谢谢

单向:

 sed '/daemon www.*Y=/{:l s/\(Y=\(0,\)*\)[0-9]*/\10/;/Y=\(0,\)*0\([^,0-9]\|$\)/!bl}' input
一些解释:

if this line contains daemon www and Y=        #  /daemon www.*Y=/{
    loop                                       # :l
      a. find Y= and zeros followed by commas  # s/\(Y=\(0,\)*\)
      b. find a series of digits               # [0-9]*
      c. replace matches in 'a' and 'b' with   # /\10/g
         'a' and 0 
      d. jump to loop if cannot match the 
         desired pattern: Y=0,0..,0            # /Y=\(0,\)*0
      e. and the pattern in d ends with a 
         non-digit non-comma character or the 
         end of line                           # \([^,0-9]\|$\)/!bl
尝试:

在行动中:

$ cat input
daemon www X=1 ***Y=1,2,2*** Z=
daemon www X=1 ***Y=1,2,2,1,3,4,5*** Z=4
daemon mail a=3

$ sed '/^daemon www.*Y/{s/[0-9]\([,*]\)/0\1/g}' input
daemon www X=1 ***Y=0,0,0*** Z=
daemon www X=1 ***Y=0,0,0,0,0,0,0*** Z=4
daemon mail a=3

我会使用
awk
。但是如果您真的必须使用
sed
,您可以忽略它

awk '/daemon www.*Y=*/{for(i=1;i<=NF;i++) ($i~/Y=/)?gsub(/[0-9]/,"0",$i):$i}1' file
awk'/daemon www.*Y=*/{for(i=1;i请尝试以下操作:

sed -e 's/^\(daemon www X=1 .*Y=\)[0-9]\+/\10/' -e 's/,[0-9]\+/,0/g'

awk也承认一行,你知道……为什么只有sed
?这是家庭作业吗?那些
***
真的在那里吗?@Jaypal:为什么任何人都需要sed以外的东西?sed!对不起。星号应该突出显示“Y=…”。不是家庭作业。工作项目。我确信只有使用sed才能完成…您的输出看起来非常奇怪…使用GNU sed版本4.2.1仍在运行。
*
似乎也变成了0。
守护进程www X=1***Y=0,0,0,0,0,00000 Z=4
就是这些东西!太好了!!我有机会得到简短的解释吗?sed文档发音不好。一开始看起来很复杂,但现在有了意义:)谢谢!!哦,很高兴有人注意到了+1,尽管你真的不需要在字符类内转义。啊,请擦掉它。你从动作中的
sed中删除了它。
awk'BEGIN{print“谢谢你,弗雷德!”
awk '/daemon www.*Y=*/{for(i=1;i<=NF;i++) ($i~/Y=/)?gsub(/[0-9]/,"0",$i):$i}1' file
$ cat file
daemon www X=1 ***Y=1,2,2*** Z=
daemon www X=1 ***Y=1,2,2,1,3,4,5*** Z=4
daemon mail a=3 Y=3,45,
$ awk '/daemon www.*Y=*/{for(i=1;i<=NF;i++) ($i~/Y=/)?gsub(/[0-9]/,"0",$i):$i}1' file
daemon www X=1 ***Y=0,0,0*** Z=
daemon www X=1 ***Y=0,0,0,0,0,0,0*** Z=4
daemon mail a=3 Y=3,45,
sed -e 's/^\(daemon www X=1 .*Y=\)[0-9]\+/\10/' -e 's/,[0-9]\+/,0/g'