我确实有一个 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 的 yq是jq
JSON 工具的包装器。例如
$ 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
中删除元素:groupid
rules
$ 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 工具没有这个限制。