如何使用SED命令在特定的确切字符之后更改字符?

时间:2019-04-10 20:19:27

标签: bash shell sed

我正在编写一个bash脚本,以将文件中的所有B'10'值更改为B'12'。

所以我有一个文件,其中B'10'被多次提及。并且也可以是具有不同长度的B'1010101010“。所有这些都必须是B'12121212”。我试图用SED命令更改它:

sed -i -r "/[B'][10]+/s/10/12/g" filename 

sed -i -r "/[B'][[0-9][0-9]]*[10]+/s/10/12/g" filename

我必须指定两次,仅用于匹配B'10'和许多B'1010101010 ..”。如果仅指定第二个命令,它将忽略单个B'10'匹配。因此,此命令是更改值,但是它可以找到的所有“ 10”匹配项都在更改。但是,我只需要在完全B和B字符附近的单列之后更改。

感谢所有帮助!!谢谢。

3 个答案:

答案 0 :(得分:2)

如果sed支持标签:

sed ':1 s/\(B\x27\(12\)*\)10/\112/; t1' file # or
sed -E ':1 s/(B\x27(12)*)10/\112/; t1' file
  • :1标签1
  • (B\x27(12)*)B'匹配,后跟零个或多个12,将其放入捕获组1
  • \1扩展到捕获组1中保留的值,
  • t1的意思是“如果执行了成功的替换,请返回标签1”。

答案 1 :(得分:1)

在使用-i选项之前通过gnu sed尝试;

sed -E ":s s/\b(B')((12)*)10(10|\"|')/\1\212\4/ ;ts"  filename

答案 2 :(得分:0)

要更改10之后的所有B',请从10中的最后一个1010...10开始。
更改完最后一个后,请再次执行并替换新的最后一个10

echo "B'1010101010111213" | sed -r ":a; s/B'((10)*)(10)/B'\112/; ta"