在特定字符串后添加括号

时间:2021-01-27 14:15:13

标签: awk sed

我想在等号后面加上 (),如下所示。

文件中的实际变量:vm_names=vm1 vm2 vm3

我想把它改成:vm_names=(vm1 vm2 vm3)

我尝试了下面的命令,但它给出了不同的输出

sed -i 's/.*/(&)/' file_name

O/p: (vm_names=vm1 vm2 vm3)

7 个答案:

答案 0 :(得分:2)

你可以使用

sed -i 's/=\(.*\)/=(\1)/' file_name

详情

  • =\(.*\) - 匹配 =,然后将字符串的其余部分捕获到 Group 1 中
  • =(\1) - 替换为 =( + Group 1 值和 )

查看online demo

s='vm_names=vm1 vm2 vm3'
sed 's/=\(.*\)/=(\1)/' <<< "$s"
# => vm_names=(vm1 vm2 vm3)

答案 1 :(得分:2)

您能否尝试使用所示示例进行以下操作、编写和测试。这将在终端上打印结果,一旦您对结果感到满意,您就可以使用 -i 选项对 Input_file 本身进行就地编辑。

sed 's/=/&(/;/=/s/$/)/' Input_file

说明: 只需将 = 替换为 =(,然后根据要求在行的最后附加 )

答案 2 :(得分:2)

另一个实现您的逻辑的 sed

sed -i '/=/s/[^=]*$/(&)/' file

如果行匹配 = 符号,则将右侧的所有内容都用括号括起来。

答案 3 :(得分:1)

使用awk

$ echo 'vm_names=vm1 vm2 vm3' | awk -F= '{print $1 FS "(" $2 ")"}'
vm_names=(vm1 vm2 vm3)
  • -F= 设置 = 作为输入字段分隔符
  • $1$2 具有第一个和第二个字段的内容
  • FS 变量存储输入字段分隔符
  • "("")" 是两个字符串文字
  • 相邻的字符串被连接起来

使用perl

$ echo 'vm_names=vm1 vm2 vm3' | perl -pe 's/=\K.+/($&)/'
vm_names=(vm1 vm2 vm3)
  • =\K 匹配 = 个字符,但不是通过 $& 变量可用的匹配部分的一部分
  • .+ 字符后的其余行

答案 4 :(得分:1)

我会使用 AWK 作为以下方式,让 file.txt 内容为

vm_names=vm1 vm2 vm3

然后

awk 'BEGIN{FS="="}{print NF==2?$1"=("$2")":$0}' file.txt

输出

vm_names=(vm1 vm2 vm3)

假设:file.txt 中的每一行最多有 1 个 =。说明:将字段分隔符 (FS) 设置为 = 然后如果我们有 2 个字段,则打印 = 之前的内容,然后是 =(,然后是 = 之后的内容,然后是 { {1}} 否则整行 ())

(在 gawk 4.2.1 中测试)

答案 5 :(得分:1)

您也可以尝试使用 awk

awk '{gsub(/=/,"=(");$NF=$NF")"} 1' file
vm_names=(vm1 vm2 vm3)

此代码:只需将 = 替换为 =(,然后在最后一个字段的末尾附加 )

答案 6 :(得分:1)

假设文件 test.txt 有多行:

name1=v1 v2 v3

name2=v4 v5 v6

...

执行此命令while read -r line; do line=${line/=/=(}; line="$line)"; echo $line; done < test.txt

解释

  • =替换=(
  • 在每行末尾添加 )