在grep后添加文本:使用BASH删除单词
我有这样一个文件:在grep后添加文本:使用BASH删除单词,bash,awk,sed,grep,Bash,Awk,Sed,Grep,我有这样一个文件: $account = [ 'user1', 'anotheruser1', 'companyaccount', ] $password = [ 'aokroae', '43t03it0i0i', '430it935ti', ] 我需要创建一个bash脚本,其中greps例如“$account=[”并将新用户添加到$account中的行末尾。 哪种方法最好 因此,如果我想通过bash脚本添加用户“Michael”,那么预期的输出将是$ac
$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
匹配,则分支到标签$account
i
- 否则,
将开始处理下一行b
标签引入一个块来读取下一行(i
),如果找到n
,它将插入(]
)新值并开始正常处理下一行(i
)b
- 否则,
块将处理下一行(i
)bi
sed -e "/\$account = \[/a\ \ \ 'newuser',"
a
只需在匹配的行之后添加新行
要将其添加到末尾,也可以使用sed:
sed -e '/[$]account = \[/bi;b;:i {n;/\]/{i \ '\'newuser\',$'\nb};bi}'
说明:
如果bi
匹配,则分支到标签$account
i
- 否则,
将开始处理下一行b
标签引入一个块来读取下一行(i
),如果找到n
,它将插入(]
)新值并开始正常处理下一行(i
)b
- 否则,
块将处理下一行(i
)bi
awk '/^[$]account/,/]/{ if (/]/) {print " '\''Michael'\'',";}} 1' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
工作原理
这定义了一系列行,以/^[$]账户/,/]/
开始,以$account
结束]
对于范围内的行,如果该行包含if(/]/){print'\''Michael'\'',;}
,则添加Michael]
这是awk对打印行的神秘速记1
这定义了一系列行,以/^[$]账户/,/]/
开始,以$account
结束]
对于范围内的行,此测试查看该行是否包含{/]/s/^/'Michael',\n/}
。如果是这样的话,那么迈克尔将在队伍的开头被替换 我们不需要明确地告诉sed它应该打印行。sed默认这样做]
awk '/^[$]account/,/]/{ if (/]/) {print " '\''Michael'\'',";}} 1' file
$account = [
'user1',
'anotheruser1',
'companyaccount',
'Michael',
]
$password = [
'aokroae',
'43t03it0i0i',
'430it935ti',
]
工作原理
这定义了一系列行,以/^[$]账户/,/]/
开始,以$account
结束]
对于范围内的行,如果该行包含if(/]/){print'\''Michael'\'',;}
,则添加Michael]
这是awk对打印行的神秘速记1
这定义了一系列行,以/^[$]账户/,/]/
开始,以$account
结束]
对于范围内的行,此测试查看该行是否包含{/]/s/^/'Michael',\n/}
。如果是这样的话,那么迈克尔将在队伍的开头被替换 我们不需要明确地告诉sed它应该打印行。sed默认这样做]
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',
]
您可以使用此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',
]
- 如果您愿意,请选择代码的开头或结尾部分(注释下面的2行或删除它们)
- 在不同的部分中添加相同的代码
- 不要忘记节值是一个正则表达式值
- 它使用
和i\
插入并附加一行文本(下一行)和过滤器来选择要应用的好文本部分a\
- 如果您愿意,请选择代码的开头或结尾部分(注释下面的2行或删除它们)
- 在不同的部分中添加相同的代码
- 不要忘记节值是一个正则表达式值
- 它使用
和i\
插入并附加一行文本(下一行)和过滤器来选择要应用的好文本部分a\
- 最简单的方法是保留前一行,然后在必要时用新文本替换它的文本,以便保留缩进:
$ 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,并始终缩进添加的文本,使其与前一行对齐,无需硬编码缩进。最简单的方法是保留前一行,然后在必要时用新文本替换其文本,以便保留缩进:
$ 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,并始终缩进添加的文本,使其与前一行对齐,无需硬编码缩进。您的预期输出是什么?更新了问题,使其更加清晰。用户列表的顺序重要吗,或者可以在列表顶部插入新用户吗?您的预期输出是什么?更新了问题,使其更加清晰。用户列表的顺序重要吗?或者可以在列表顶部插入新用户吗?谢谢!其他答案也不错,但您的答案描述了awk和sed的使用方法。谢谢!其他答案也很好,但您的答案描述了如何使用awk和sed。