grep之后添加文本:使用BASH输入单词

时间:2015-04-14 10:00:32

标签: bash awk sed grep

我有一个这样的文件:

$account = [
   'user1',
   'anotheruser1',
   'companyaccount',
]

$password = [
   'aokroae',
   '43t03it0i0i',
   '430it935ti',
]

我需要创建一个bash脚本,例如“$ account = [”并在$ account中的行末添加新用户。 哪种方法最好?

所以,如果我想通过bash脚本添加用户“Michael”,那么预期的输出将是$ account:

$account = [
   'user1',
   'anotheruser1',
   'companyaccount',
   'Michael',
] 

5 个答案:

答案 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

这将迈克尔添加到列表的末尾:

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

$ 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
  • 如果您喜欢该部分的开头或结尾,请选择代码部分(注释下面的2行或删除它们)
  • 要在不同部分添加的相同代码
  • 不要忘记 Section 值是正则表达式值
  • 它使用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',
]