在 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 中都有效,并且总是缩进添加的文本,使其与前一行对齐,无需硬编码缩进。