用正则表达式替换字符串

时间:2014-07-30 19:01:43

标签: bash shell awk sed

我有一堆字符串,如“{one} two”,其中“{one}”可能不同,“two”总是相同。我需要用“三个{1}”替换原始的刺痛,“三个”也是不变的。例如,可以使用python轻松完成,但我需要使用shell工具完成它,比如sed或awk。

7 个答案:

答案 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; (这意味着您的行不应包含多于表示该字段的行)。