我有一个这样的文件:
$account = [
'user1',
'anotheruser1',
'companyaccount',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
我需要创建一个bash脚本,例如“$ account = [”并在$ account中的行末添加新用户。 哪种方法最好?
所以,如果我想通过bash脚本添加用户“Michael”,那么预期的输出将是$ account:
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
答案 0 :(得分:2)
如果您可以将信息添加到列表的开头,则会更容易:
sed -e "/\$account = \[/a\ \ \ 'newuser',"
a
只需在匹配后添加一个新行。
要将其添加到最后,您也可以使用sed:
sed -e '/[$]account = \[/bi;b;:i {n;/\]/{i \ '\'newuser\',$'\nb};bi}'
说明:
bi
匹配,则i
分支到标签$account
。b
只是开始处理下一行。i
标签引入了一个读取下一行(n
)的块,如果找到]
,则会插入(i
)新值并开始处理通常是下一行(b
)。i
块处理下一行(bi
)。答案 1 :(得分:1)
这将迈克尔添加到列表的末尾:
awk '/^[$]account/,/]/{ if (/]/) {print " '\''Michael'\'',";}} 1' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
/^[$]account/, /]/
这定义了一系列以$account
开头并以]
if (/]/) {print " '\''Michael'\'',";}
对于范围内的行,如果该行包含]
,则添加Michael。
1
这是awk用于打印线的神秘简写。
$ sed "/^[$]account/,/]/ { /]/ s/^/ 'Michael',\n/}" file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
这里的逻辑非常类似于awk代码中使用的逻辑:
/^[$]account/,/]/
这定义了一系列以$account
开头并以]
{ /]/ s/^/ 'Michael',\n/}
对于范围内的行,此测试用于查看该行是否包含]
。如果是这样,那么迈克尔将在该行的开头被替换。
我们不需要明确告诉sed应该打印该行。 sed默认执行此操作。
答案 2 :(得分:1)
# Variable assignation for generic use
Section="account"
Value="NewUser"
# value integration in section
sed "
# filter to only good section (just print for others)
/^[$]${Section} = \\[/,/]/ !b
# To add at begin
/^[$]${Section} = \\[/ a\\
'${Value}'
# To add at the end
/]/ i\\
'${Value}'
" YourFile
i\
和a\
进行插入并附加一行文字(下一行)并过滤以选择要应用的文本的好部分答案 3 :(得分:1)
最简单的做法是保留上一行,然后在必要时用新文本替换它的文本,以便保留缩进:
$ awk -v srch='$account' -v add='Michael' '
$1 == srch { f = 1 }
f && /]/ { sub(/[^\047[:space:]]+/,add,prev); print prev; f = 0 }
{ print; prev = $0 }
' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
以上内容适用于任何awk,并且将始终缩进添加的文本,使其与前一行对齐,不需要对缩进进行硬编码。
答案 4 :(得分:0)
你可以使用这个gnu-awk:
awk -v sq="'" -v RS='\\]\n' '/account =/{$0 = $0 " " sq "Michael" sq "," ORS }
{printf $0 RT}' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]