如何从文件中删除特定字符串

如何从文件中删除特定字符串

我确实有一个 bash 脚本。我想从文本文件中删除特定字符串。我已经在网上找到了一个命令,但似乎不太稳定。

我试过了;

mv .admins .adminsold
sed -r "s#${MYFUNCTION}(,|$)##g" <.adminsold >.admins

我的输入文件;

# Admin rule
[[rule]]
    # Set your admin Group Ids here, ex: [ 13, 42 ]
        groupid = [  329, 2, 324, 156 ]
    # And/Or your admin Client Uids here
    useruid = []
    # By default treat requests from localhost as admin
    ip = [ "127.0.0.1", "::1" ]
    "+" = "*"

预期文件;

# Admin rule
[[rule]]
    # Set your admin Group Ids here, ex: [ 13, 42 ]
        groupid = [  329, 2, 156 ]
    # And/Or your admin Client Uids here
    useruid = []
    # By default treat requests from localhost as admin
    ip = [ "127.0.0.1", "::1" ]
    "+" = "*"

答案1

如果您需要做的就是删除324,即:一个空格,然后324一个逗号,),然后使用:

sed 's/ 324,//' file

并编辑文件本身(即覆盖原始文件), 使用:

sed -i 's/ 324,//' file

请参见这个答案了解更多信息。


从您的示例中需要考虑的事项:

  • ?将使前一个字符成为可选的,并且您需要用反斜杠将其转义\...例如,为了使,可选用法成为:

    sed 's/ 324,\?//' file
    
  • 如果需要匹配文字/,则需要对其进行转义\/,或者将分隔符从通常的分隔符更改/为其他内容,例如@或者:其他)像这样:

    sed 's@wxyz0123456789+/@@' file
    
  • 如果您只想对包含以下内容的行应用替换,groupid则请/groupid/在替换部分之前指定条件,如下所示:

    sed '/groupid/ s/ 324,//' file
    

答案2

由于您的输入文件似乎是托木斯克,您可以考虑使用 TOML 工具来操作它 - 它可能比使用严格基于文本的实用程序更为强大。

我最熟悉的工具是kislyuk 的 yqjqJSON 工具的包装器。例如

$ cat .admins 
# Admin rule
[[rule]]
    # Set your admin Group Ids here, ex: [ 13, 42 ]
        groupid = [  329 , 2, 324, 156 ]
    # And/Or your admin Client Uids here
    useruid = []
    # By default treat requests from localhost as admin
    ip = [ "127.0.0.1", "::1" ]
    "+" = "*"

然后从该部分的数组324中删除元素:groupidrules

$ tomlq -t --argjson id 324 '.rule[] |= del(.groupid[] | select(. == $id))' .admins 
[[rule]]
groupid = [ 329, 2, 156,]
useruid = []
ip = [ "127.0.0.1", "::1",]
"+" = "*"

不幸的是,虽然 TOML 允许评论,但 JSON 不允许 - 所以它们被删除:可能有其他 TOML 工具没有这个限制。

相关内容