假设我有'abbc'字符串,我想替换:

Ab -> BC BC -> ab

如果我尝试两次替换,结果不是我想要的:

echo 'abbc' | sed 's/ab/bc/g;s/bc/ab/g'
abab

那么我可以像下面这样使用什么sed命令来替换?

echo abbc | sed SED_COMMAND
bcab

编辑: 实际上,文本可以有超过2个模式,我不知道我需要多少替换。因为有一个答案说sed是一个流编辑器,它的替换是贪婪的,我认为我将需要使用一些脚本语言。


当前回答

我总是使用多个带有"-e"的语句

$ sed - e ' s:和:\ n: g - e ' s GROUP BY: \ n: g - e ' s:联盟:\ n: g - e ' s:从:\ n: g的文件> readable.sql

这将在所有AND, GROUP BY, UNION和FROM之前添加一个'\n',而'&'表示匹配的字符串,'\n&'表示您想在'matched'之前用'\n'替换匹配的字符串。

其他回答

这是一个基于oogas sed的awk

echo 'abbc' | awk '{gsub(/ab/,"xy");gsub(/bc/,"ab");gsub(/xy/,"bc")}1'
bcab

我总是使用多个带有"-e"的语句

$ sed - e ' s:和:\ n: g - e ' s GROUP BY: \ n: g - e ' s:联盟:\ n: g - e ' s:从:\ n: g的文件> readable.sql

这将在所有AND, GROUP BY, UNION和FROM之前添加一个'\n',而'&'表示匹配的字符串,'\n&'表示您想在'matched'之前用'\n'替换匹配的字符串。

也许是这样的:

sed 's/ab/~~/g; s/bc/ab/g; s/~~/bc/g'

将~替换为一个您知道不会出现在字符串中的字符。

对于单个模式的出现,可能有一个更简单的方法,您可以尝试如下: Echo 'abbc' | sed 's/ab/bc/; 's/ bc/ab/2'

我的输出:

 ~# echo 'abbc' | sed 's/ab/bc/;s/bc/ab/2'
 bcab

对于pattern的多次出现:

sed 's/\(ab\)\(bc\)/\2\1/g'

例子

~# cat try.txt
abbc abbc abbc
bcab abbc bcab
abbc abbc bcab

~# sed 's/\(ab\)\(bc\)/\2\1/g' try.txt
bcab bcab bcab
bcab bcab bcab
bcab bcab bcab

希望这能有所帮助!!

以下是SED手册的节选:

- e脚本 ——表达=脚本 将脚本中的命令添加到处理输入时要运行的命令集中。

在每个替换前加上-e选项并将它们收集在一起。下面是一个适合我的例子:

sed < ../.env-turret.dist \
  -e "s/{{ name }}/turret$TURRETS_COUNT_INIT/g" \
  -e "s/{{ account }}/$CFW_ACCOUNT_ID/g" > ./.env.dist

这个例子还展示了如何在替换中使用环境变量。