我有一堆字符串,如“{one} two”,其中“{one}”可能不同,“two”总是相同。我需要用“三个{1}”替换原始的刺痛,“三个”也是不变的。例如,可以使用python轻松完成,但我需要使用shell工具完成它,比如sed或awk。
答案 0 :(得分:2)
使用sed
:
s="{one}two"
sed 's/^\(.*\)two/three\1/' <<< "$s"
three{one}
答案 1 :(得分:2)
如果我理解正确,你想:
{one}two --> three{one}
{two}two --> three{two}
{n}two --> three{n}
带有反向引用的SED会这样做:
echo "{one}two" | sed 's/\(.*\)two$/three\1/'
搜索将所有文本存储到您的固定字符串,然后替换为预先附加到存储文本的新字符串。 SED默认是贪婪的,所以它应该抓住所有文本到你的固定字符串,即使在变量部分中有一些重复(例如,x。},{two}两个仍然会正确地重新映射到三个{two} )。
答案 2 :(得分:1)
echo "XXXtwo" | sed -E 's/(.*)two/three\1/'
答案 3 :(得分:1)
以下是仅限Bash的解决方案:
string="{one}two"
echo "three${string/two/}"
答案 4 :(得分:0)
通过GNU sed,
$ echo 'foo {one}two bar' | sed -r 's/(\{[^}]*\})two/three\1/g'
foo three{one} bar
基本sed,
$ echo 'foo {one}two bar' | sed 's/\({[^}]*}\)two/three\1/g'
foo three{one} bar
答案 5 :(得分:0)
awk '{a=gensub(/(.*)two/,"three\\1","g"); print a}' <<< "{one}two"
输出:
three{one}
答案 6 :(得分:0)
awk '/{.*}two/ { split($0,s,"}"); print "three"s[1]"}" }' <<< "{one}two"
也会输出
three{one}
在这里,我们使用awk找到正确的行,然后拆分&#34;}&#34; (这意味着您的行不应包含多于表示该字段的行)。