sed charachter没有动过比赛

时间:2018-05-20 10:43:15

标签: sed wildcard

如果我有

123456red100green 123456bee010yellow 123456usb110orange 123456sos011querty 123456let101bottle

我希望它是

123456red111green 123456bee111yellow 123456usb111orange 123456sos111querty 123456let111bottle

注意:前6个字符不会改变,,,,         以下6个改变,,,,         这些字符串也可能在文件中的任何位置(开头,结尾,任何地方)

我想指定sed 1)找到123456 2)跳过接下来的三个字符 3)用111替换接下来的三个

我最接近的是: sed '/s/123456....../123456...111/g' 我知道点意味着什么,但我不知道另一方面的等价物。简而言之,如何命令sed保持匹配中的字符不变。 很抱歉我不清楚我想要什么,请耐心等待我

2 个答案:

答案 0 :(得分:0)

匹配123456后跟三个不需要修改的字符,然后用111替换接下来的三个字符:

sed 's/\(123456...\).../\1111/g' file

\( ... \)捕获我们不想修改的字符串部分。用\1重新插入这些内容。该行的整个匹配位替换为“\( ... \)中的位(即\1),后跟111”。

答案 1 :(得分:0)

如果你想改变每一个零(如你的例子中所示),那么只需sed 's/0/1/g'即可。或sed -e '/^123456/ s/0/1/g'在以123456开头的行上执行相同操作。

但是,要按照您的要求计算字符数,请使用( .. )来捕获不同的部分,并使用\1来替换它们(使用sed -E)。所以:

echo 123456abcdefgh | sed -Ee 's/^(123456...).../\1111/'

输出123456abc111gh\1会放回与123456...匹配的部分,接下来的三个是字面字符。

(没有-E,您需要\( .. \)进行分组。)