尝试匹配和修改 awk 或 sed 中的部分行

Trying to match and modify part of a line in awk or sed

我尝试了几个语法 (sed/awk) 在特定行的末尾添加一个后缀,在“{”之前包含“ltm virtual /Common/”(它是一个 bigip 平台 > bigip.conf ) 但我不是专家使用它..

我在文件中得到了这些行:

ltm virtual /Common/VS_exemple_80 {

ltm virtual /Common/VS_exemple_443 {

ltm virtual /Common/VS_test_80 {

ltm virtual /Common/VS_test_443 {

我确实需要在最后添加 XX,像这样:

ltm virtual /Common/VS_exemple_80_XX {

ltm virtual /Common/VS_exemple_443_XX {

ltm virtual /Common/VS_test_80_XX {

ltm virtual /Common/VS_test_443_XX {

请注意,我需要执行此更改的所有行都以:

开头
ltm virtual /Common/VS_XXXXX

我试图做的是找到“ltm virtual”行,运行 从 VS_ 到行“{”的末尾并附加“_XX”

谢谢大家..

我试过了:

sed -i '/^ltm virtual/s/[^ ]*$/&_XX/' bigip.conf.bkp

我可以匹配正确的行,但后缀附加在行尾..

ltm virtual /Common/VS_test_80 {_XX

您正在匹配整行,然后在末尾添加 _XX。您只需要将行的一部分匹配到 {.

sed -r 's/^ltm virtual \/Common\/VS_\w+/&_XX/'

请注意 \w+(一个或多个单词字符)需要扩展正则表达式,因为您需要 -r.

正则表达式末尾的 $ 将其锚定到行尾,因此使其与输入中的任何字符串都不匹配,而且您正在尝试使用 / s 在由 /s 分隔的正则表达式中,你不能这样做 - 当试图匹配 sed 中的正则表达式 a/b 时,你必须转义 [=12] 而不是 /a/b/ =] 像 /a\/b/ 或更简洁地使用不同的分隔符,例如:a/b:.

使用任何 sed:

$ sed 's:ltm virtual /Common/[^ ]*:&_XX:' file
ltm virtual /Common/VS_exemple_80_XX {

ltm virtual /Common/VS_exemple_443_XX {

ltm virtual /Common/VS_test_80_XX {

ltm virtual /Common/VS_test_443_XX {