我想在等号后面加上 (),如下所示。
文件中的实际变量:vm_names=vm1 vm2 vm3
我想把它改成:vm_names=(vm1 vm2 vm3)
我尝试了下面的命令,但它给出了不同的输出
sed -i 's/.*/(&)/' file_name
O/p: (vm_names=vm1 vm2 vm3)
答案 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
解释:
=
替换=(
)
。