假设我有'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是一个流编辑器,它的替换是贪婪的,我认为我将需要使用一些脚本语言。
假设我有'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是一个流编辑器,它的替换是贪婪的,我认为我将需要使用一些脚本语言。
当前回答
如果将字符串替换为Variable,则解决方案将不起作用。 sed命令需要使用双引号,而不是单引号。
#sed -e "s/#replacevarServiceName#/$varServiceName/g" -e "s/#replacevarImageTag#/$varImageTag/g" deployment.yaml
其他回答
对于单个模式的出现,可能有一个更简单的方法,您可以尝试如下: 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
希望这能有所帮助!!
Tcl有一个内置的功能
$ tclsh
% string map {ab bc bc ab} abbc
bcab
它的工作原理是每次遍历字符串的一个字符,从当前位置开始进行字符串比较。
在perl中:
perl -E '
sub string_map {
my ($str, %map) = @_;
my $i = 0;
while ($i < length $str) {
KEYS:
for my $key (keys %map) {
if (substr($str, $i, length $key) eq $key) {
substr($str, $i, length $key) = $map{$key};
$i += length($map{$key}) - 1;
last KEYS;
}
}
$i++;
}
return $str;
}
say string_map("abbc", "ab"=>"bc", "bc"=>"ab");
'
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
这个例子还展示了如何在替换中使用环境变量。
这是一个基于oogas sed的awk
echo 'abbc' | awk '{gsub(/ab/,"xy");gsub(/bc/,"ab");gsub(/xy/,"bc")}1'
bcab
这可能为你工作(GNU sed):
sed -r '1{x;s/^/:abbc:bcab/;x};G;s/^/\n/;:a;/\n\n/{P;d};s/\n(ab|bc)(.*\n.*:(\1)([^:]*))/\4\n\2/;ta;s/\n(.)/\1\n/;ta' file
它使用一个查找表,该表准备好并保存在保留空间(HS)中,然后附加到每一行。一个唯一的标记(在本例中是\n)被前置在行开始之前,并用作在整个行长度上进行搜索的方法。一旦标记到达行尾,该过程就完成了,并打印出查找表,标记被丢弃。
注意:查找表在一开始就准备好了,并且选择了第二个唯一标记(在本例中为:),以避免与替换字符串冲突。
以下是一些评论:
sed -r '
# initialize hold with :abbc:bcab
1 {
x
s/^/:abbc:bcab/
x
}
G # append hold to patt (after a \n)
s/^/\n/ # prepend a \n
:a
/\n\n/ {
P # print patt up to first \n
d # delete patt & start next cycle
}
s/\n(ab|bc)(.*\n.*:(\1)([^:]*))/\4\n\2/
ta # goto a if sub occurred
s/\n(.)/\1\n/ # move one char past the first \n
ta # goto a if sub occurred
'
这个表格是这样的:
** ** replacement
:abbc:bcab
** ** pattern