在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 这会将Michael添加到列表的末尾:

awk '/^[$]account/,/]/{ if (/]/) {print "   '\''Michael'\'',";}} 1' file
$account = [
   'user1',
   'anotheruser1',
   'companyaccount',
   'Michael',
]

$password = [
   'aokroae',
   '43t03it0i0i',
   '430it935ti',
]
工作原理
  • /^[$]账户/,/]/

    这定义了一系列行,以
    $account
    开始,以
    ]
    结束

  • if(/]/){print'\''Michael'\'',;}

    对于范围内的行,如果该行包含
    ]
    ,则添加Michael

  • 1

    这是awk对打印行的神秘速记

使用sed 工作原理 这里的逻辑与awk代码中使用的逻辑非常相似:

  • /^[$]账户/,/]/

    这定义了一系列行,以
    $account
    开始,以
    ]
    结束

  • {/]/s/^/'Michael',\n/}

    对于范围内的行,此测试查看该行是否包含
    ]
    。如果是这样的话,那么迈克尔将在队伍的开头被替换

    我们不需要明确地告诉sed它应该打印行。sed默认这样做

使用awk 这会将Michael添加到列表的末尾:

awk '/^[$]account/,/]/{ if (/]/) {print "   '\''Michael'\'',";}} 1' file
$account = [
   'user1',
   'anotheruser1',
   'companyaccount',
   'Michael',
]

$password = [
   'aokroae',
   '43t03it0i0i',
   '430it935ti',
]
工作原理
  • /^[$]账户/,/]/

    这定义了一系列行,以
    $account
    开始,以
    ]
    结束

  • if(/]/){print'\''Michael'\'',;}

    对于范围内的行,如果该行包含
    ]
    ,则添加Michael

  • 1

    这是awk对打印行的神秘速记

使用sed 工作原理 这里的逻辑与awk代码中使用的逻辑非常相似:

  • /^[$]账户/,/]/

    这定义了一系列行,以
    $account
    开始,以
    ]
    结束

  • {/]/s/^/'Michael',\n/}

    对于范围内的行,此测试查看该行是否包含
    ]
    。如果是这样的话,那么迈克尔将在队伍的开头被替换

    我们不需要明确地告诉sed它应该打印行。sed默认这样做


您可以使用此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',
]

您可以使用此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。