Regex sed自动替换是否到位?
我有这段代码,我确实想替换一个特定的模式,但不是多点替换Regex sed自动替换是否到位?,regex,bash,sed,Regex,Bash,Sed,我有这段代码,我确实想替换一个特定的模式,但不是多点替换 echo "ss qq" | sed "s/ss/qq/g; s/qq/dd/g;" 结果是 dd dd 但愿如此 qq dd 同样,通过“循环”,我们得到了相同的结果 echo "ss qq" | sed ":loop; s/ss/qq/g; s/qq/dd/g; t loop;" 它很小,非常令人失望 有什么建议说明为什么会这样吗 那是什么 QQDD 然后按相反顺序进行替换: 更改sed“s/ss/qq/g;s/qq/d
echo "ss qq" | sed "s/ss/qq/g; s/qq/dd/g;"
结果是
dd dd
但愿如此
qq dd
同样,通过“循环”,我们得到了相同的结果
echo "ss qq" | sed ":loop; s/ss/qq/g; s/qq/dd/g; t loop;"
它很小,非常令人失望
有什么建议说明为什么会这样吗
那是什么
QQDD
然后按相反顺序进行替换:
更改sed“s/ss/qq/g;s/qq/dd/g;”
->sed“s/qq/dd/g;s/ss/qq/g;”
那是什么
QQDD
然后按相反顺序进行替换:
将sed“s/ss/qq/g;s/qq/dd/g;”->sed“s/qq/dd/g;s/ss/qq/g;”更改为“发生的原因”:sed逐行获取输入,然后按顺序应用每个命令。如果查看命令的GNU sed(4.6或更新版本)的调试输出,这一点会更加清楚:
$ sed --debug 's/ss/qq/g;s/qq/dd/g' <<< 'ss qq'
SED PROGRAM:
s/ss/qq/g
s/qq/dd/g
INPUT: 'STDIN' line 1
PATTERN: ss qq # Pattern space before first command is applied
COMMAND: s/ss/qq/g
MATCHED REGEX REGISTERS
regex[0] = 0-2 'ss'
PATTERN: qq qq # Pattern space before second command is applied
COMMAND: s/qq/dd/g
MATCHED REGEX REGISTERS
regex[0] = 0-2 'qq'
PATTERN: dd dd
END-OF-CYCLE:
dd dd
$sed--debug的s/ss/qq/g;s/qq/dd/g'至于“为什么会这样”:sed逐行获取输入,然后按顺序应用每个命令。如果查看命令的GNU sed(4.6或更新版本)的调试输出,这一点会更加清楚:
$ sed --debug 's/ss/qq/g;s/qq/dd/g' <<< 'ss qq'
SED PROGRAM:
s/ss/qq/g
s/qq/dd/g
INPUT: 'STDIN' line 1
PATTERN: ss qq # Pattern space before first command is applied
COMMAND: s/ss/qq/g
MATCHED REGEX REGISTERS
regex[0] = 0-2 'ss'
PATTERN: qq qq # Pattern space before second command is applied
COMMAND: s/qq/dd/g
MATCHED REGEX REGISTERS
regex[0] = 0-2 'qq'
PATTERN: dd dd
END-OF-CYCLE:
dd dd
$sed--debug的s/ss/qq/g;s/qq/dd/g'可能是您要查找的y///
命令的行为:
▶ 回音“ss qq”| sed'y/sq/qd/'
QQDD
这将逐个字符将所有s
转换为q
,并将所有q
转换为d
。可能是您正在查找的y//
命令的行为:
▶ 回音“ss qq”| sed'y/sq/qd/'
QQDD
这将逐个字符将所有s
转换为q
,并将所有q
转换为d
。这可能适用于您(GNU-sed):
这将以换行符的形式引入一个标记,以确定最后一次替换发生的位置。在该行的末尾,将删除标记
之所以使用标记,是因为每次调用替换命令都从行首重新开始,而不是从最后一次替换完成的位置开始。g
标志可能会混淆问题,但只属于替换的当前调用
如前所述,更好的方法是在第一个替换中使用替代项,并将其作为最后一个命令全局替换
sed 's/ss/\n/g;s/qq/dd/g;s/\n/qq/g' file
这可能适用于您(GNU-sed):
这将以换行符的形式引入一个标记,以确定最后一次替换发生的位置。在该行的末尾,将删除标记
之所以使用标记,是因为每次调用替换命令都从行首重新开始,而不是从最后一次替换完成的位置开始。g
标志可能会混淆问题,但只属于替换的当前调用
如前所述,更好的方法是在第一个替换中使用替代项,并将其作为最后一个命令全局替换
sed 's/ss/\n/g;s/qq/dd/g;s/\n/qq/g' file
sed
分号分隔的命令连续执行,这就是原因。看看这可能对你有用。试试这里发布的解决方案:如果只需要更改单个字母(而不是单词),你可以使用tr
:echo“ss qq”| tr sq qd
givesqq dd
sed
分号分隔的命令连续执行,这就是原因。看看这可能对你有用。试试这里发布的解决方案:如果只需要更改单个字母(而不是单词),你可以使用tr
:echo“ss qq”| tr sq qd
给出qq dd
@mr.tee它需要GNU sed 4.6或更高版本,但原理是一样的-调试输出只是为了说明。@mr.tee它需要GNU sed 4.6或更新版本,但原理是一样的-调试输出只是为了说明。