在 grep:ing 一个带有 BASH 的单词后添加文本
Add text after grep:ing a word with BASH
我有这样一个文件:
$account = [
'user1',
'anotheruser1',
'companyaccount',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
我需要创建一个 bash 脚本来 greps 例如“$account = [”并在 $account 中行的末尾添加新用户。
哪种方法最好?
因此,如果我想通过 bash 脚本添加用户 "Michael",那么预期的输出将是 $account:
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
如果您可以将信息添加到列表的开头,那就更容易了:
sed -e "/$account = \[/a\ \ \ 'newuser',"
a
只是在匹配的行之后添加一个新行。
要加到最后,也可以用sed:
sed -e '/[$]account = \[/bi;b;:i {n;/\]/{i \ '\'newuser\',$'\nb};bi}'
解释:
如果 $account
匹配,bi
分支到标签 i
。
- 否则,
b
将开始处理下一行。
-
i
标签引入了一个读取下一行 (n
) 的块,如果它找到 ]
,它会插入 (i
) 新值并且开始正常处理下一行 (b
).
- 否则,
i
块处理下一行 (bi
)。
使用 awk
这会将 Michael 添加到列表末尾:
awk '/^[$]account/,/]/{ if (/]/) {print " '\''Michael'\'',";}} 1' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
工作原理
/^[$]account/, /]/
这定义了一系列以 $account
开始并以 ]
结束的行
if (/]/) {print " '\''Michael'\'',";}
对于范围内的行,如果该行包含]
,则添加Michael.
1
这是 awk 的神秘 shorthand 打印行。
使用 sed
$ sed "/^[$]account/,/]/ { /]/ s/^/ 'Michael',\n/}" file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
工作原理
这里的逻辑与 awk 代码中使用的逻辑非常相似:
/^[$]account/,/]/
这定义了一系列以 $account
开始并以 ]
结束的行
{ /]/ s/^/ 'Michael',\n/}
对于范围内的行,这将测试该行是否包含 ]
。如果是,则 Michael 被替换为行首。
我们不需要明确告诉 sed 它应该打印该行。 sed 默认执行此操作。
你可以使用这个 gnu-awk:
awk -v sq="'" -v RS='\]\n' '/account =/{[=10=] = [=10=] " " sq "Michael" sq "," ORS }
{printf [=10=] RT}' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
# 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
- select 如果您喜欢在本节的开头或结尾的部分代码(注释掉下面的 2 行或删除它们)
- 在不同部分添加相同的代码
- 不要忘记 Section 值是一个正则表达式值
- 它使用
i\
和 a\
插入和附加一行文本(下一行)并过滤到 select 要应用的文本的大部分
最简单的做法是保留上一行,然后在必要时用新文本替换它的文本,这样您就可以保留缩进:
$ awk -v srch='$account' -v add='Michael' '
== srch { f = 1 }
f && /]/ { sub(/[^7[:space:]]+/,add,prev); print prev; f = 0 }
{ print; prev = [=10=] }
' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
以上代码在任何 awk 中都有效,并且总是缩进添加的文本,使其与前一行对齐,无需硬编码缩进。
我有这样一个文件:
$account = [
'user1',
'anotheruser1',
'companyaccount',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
我需要创建一个 bash 脚本来 greps 例如“$account = [”并在 $account 中行的末尾添加新用户。 哪种方法最好?
因此,如果我想通过 bash 脚本添加用户 "Michael",那么预期的输出将是 $account:
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
如果您可以将信息添加到列表的开头,那就更容易了:
sed -e "/$account = \[/a\ \ \ 'newuser',"
a
只是在匹配的行之后添加一个新行。
要加到最后,也可以用sed:
sed -e '/[$]account = \[/bi;b;:i {n;/\]/{i \ '\'newuser\',$'\nb};bi}'
解释:
-
如果
bi
分支到标签i
。- 否则,
b
将开始处理下一行。 -
i
标签引入了一个读取下一行 (n
) 的块,如果它找到]
,它会插入 (i
) 新值并且开始正常处理下一行 (b
). - 否则,
i
块处理下一行 (bi
)。
$account
匹配,使用 awk
这会将 Michael 添加到列表末尾:
awk '/^[$]account/,/]/{ if (/]/) {print " '\''Michael'\'',";}} 1' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
工作原理
/^[$]account/, /]/
这定义了一系列以
$account
开始并以]
结束的行
if (/]/) {print " '\''Michael'\'',";}
对于范围内的行,如果该行包含
]
,则添加Michael.1
这是 awk 的神秘 shorthand 打印行。
使用 sed
$ sed "/^[$]account/,/]/ { /]/ s/^/ 'Michael',\n/}" file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
工作原理
这里的逻辑与 awk 代码中使用的逻辑非常相似:
/^[$]account/,/]/
这定义了一系列以
$account
开始并以]
结束的行
{ /]/ s/^/ 'Michael',\n/}
对于范围内的行,这将测试该行是否包含
]
。如果是,则 Michael 被替换为行首。我们不需要明确告诉 sed 它应该打印该行。 sed 默认执行此操作。
你可以使用这个 gnu-awk:
awk -v sq="'" -v RS='\]\n' '/account =/{[=10=] = [=10=] " " sq "Michael" sq "," ORS }
{printf [=10=] RT}' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
# 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
- select 如果您喜欢在本节的开头或结尾的部分代码(注释掉下面的 2 行或删除它们)
- 在不同部分添加相同的代码
- 不要忘记 Section 值是一个正则表达式值
- 它使用
i\
和a\
插入和附加一行文本(下一行)并过滤到 select 要应用的文本的大部分
最简单的做法是保留上一行,然后在必要时用新文本替换它的文本,这样您就可以保留缩进:
$ awk -v srch='$account' -v add='Michael' '
== srch { f = 1 }
f && /]/ { sub(/[^7[:space:]]+/,add,prev); print prev; f = 0 }
{ print; prev = [=10=] }
' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
以上代码在任何 awk 中都有效,并且总是缩进添加的文本,使其与前一行对齐,无需硬编码缩进。