Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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_Bash_Sed - Fatal编程技术网

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
gives
qq dd
sed
分号分隔的命令连续执行,这就是原因。看看这可能对你有用。试试这里发布的解决方案:如果只需要更改单个字母(而不是单词),你可以使用
tr
echo“ss qq”| tr sq qd
给出
qq dd
@mr.tee它需要GNU sed 4.6或更高版本,但原理是一样的-调试输出只是为了说明。@mr.tee它需要GNU sed 4.6或更新版本,但原理是一样的-调试输出只是为了说明。