gpt4 book ai didi

string - sed 同时和顺序替换

转载 作者:行者123 更新时间:2023-11-29 08:54:40 26 4
gpt4 key购买 nike

我不确定这是否可以在 sed(或 awk 或任何 bash 工具)中做我想做的事:

我想制作一个脚本来替换 : )<happy> 的字符串中和 ) :通过 <sad> .这可以通过 sed 轻松完成:

echo "test : )" | sed 's/: )/<happy>/g'
echo "test ) :" | sed 's/) :/<sad>/g'

不幸的是,有时我有这样的字符串:

I'm happy : ) : ) : )
I'm sad ) : ) : ) :

在那种情况下,输出应该是:

I'm happy <happy> <happy> <happy>
I'm sad <sad> <sad> <sad>

但是结合上面的两个命令:

echo "I'm happy : ) : ) : )" | sed 's/: )/<happy>/g' | sed 's/) :/<sad>/g'
echo "I'm sad ) : ) : ) :" | sed 's/: )/<happy>/g' | sed 's/) :/<sad>/g'

我会得到:

I'm happy <happy> <happy> <happy>
I'm sad ) <happy> <happy> :

解决这个问题的方法是通过从左到右处理字符串来并行进行两个替换。我试着用这样的东西:sed 's/a/b/g;s/c/d/g'但是替换只是一种模式接一种模式进行,并没有解决问题。

最佳答案

使用 GNU awk 来匹配第三个参数():

$ cat script1.awk
BEGIN {
map[": )"] = "<happy>"
map[") :"] = "<sad>"
}
{
while ( match($0,/(.*)(: \)|\) :)(.*)/,a) ) {
$0 = a[1] map[a[2]] a[3]
}
print
}

$ awk -f script1.awk file
I'm happy <happy> <happy> <happy>
I'm sad <sad> <sad> <sad>

使用任何 awk:

$ cat script2.awk
BEGIN {
map[": )"] = "<happy>"
map[") :"] = "<sad>"
}
{
while ( match($0,/: \)|\) :/) ) {
$0 = substr($0,1,RSTART-1) map[substr($0,RSTART,RLENGTH)] substr($0,RSTART+RLENGTH)
}
print
}

$ awk -f script2.awk file
I'm happy <happy> <happy> <happy>
I'm sad <sad> <sad> <sad>

虽然在这种情况下这两种方法产生相同的输出,但第一种方法实际上从字符串的末尾开始工作,由前导 .* 提供,而第二种方法从前到后工作。您可以通过此测试看到这一点:

$ echo ': ) :' | awk -f script1.awk
: <sad>

$ echo ': ) :' | awk -f script2.awk
<happy> :

您可以通过任何 awk 进行从后到前的传递,但我认为这不是您真正想要的。


编辑以从 map 构建正则表达式:

$ cat tst.awk
BEGIN {
map[": )"] = "<happy>"
map[") :"] = "<sad>"
for (emoji in map) {
gsub(/[^^]/,"[&]",emoji)
gsub(/\^/,"\\^",emoji)
emojis = (emojis == "" ? "" : emojis "|") emoji
}
}
{
while ( match($0,emojis) ) {
$0 = substr($0,1,RSTART-1) map[substr($0,RSTART,RLENGTH)] substr($0,RSTART+RLENGTH)
}
print
}

$ awk -f tst.awk file
I'm happy <happy> <happy> <happy>
I'm sad <sad> <sad> <sad>

关于string - sed 同时和顺序替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51886023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com