Sed比赛N次

时间:2018-08-06 08:18:29

标签: linux shell sed

我想从下面的命令中删除一个特定的参数,

mycommand --address=127.0.0.1 --file=/usr/local/somefile --port=8090 --key-file=/usr/local/server.key 

在这种情况下,我想删除--file=/usr/local/somefile,如何将--file=中的文本与下一个--或使用{ {1}}。

4 个答案:

答案 0 :(得分:0)

如果选择awk,请尝试以下操作:

awk '{gsub(/--file=[^ ]+/, ""); print }'

根据您的输入:

echo "mycommand --address=127.0.0.1 --file=/usr/local/somefile --port=8090 --key-file=/usr/local/server.key" \
| awk '{gsub(/--file=[^ ]+/, ""); print }'

将输出:

mycommand --address=127.0.0.1  --port=8090 --key-file=/usr/local/server.key

答案 1 :(得分:0)

您可以尝试使用命令-

1)满足了第一个要求-使用Sed从模式中删除所需的文本

echo "mycommand --address=127.0.0.1 --file=/usr/local/somefile --port=8090 --key-file=/usr/local/server.key" | sed -e "s/\([[:space:]]\)[[:space:]]*/\1/g" | sed -e "s/\(.*\)--file=[[:alnum:]\/]*\(.*\)/\1\2/"

mycommand --address=127.0.0.1  --port=8090 --key-file=/usr/local/server.key

注意:如果使用的是Python,则可以轻松使用非贪婪的正则表达式,该表达式在Sed中不可用

答案 2 :(得分:0)

Bash具有内置的替代项。

bash$ set -- mycommand --address=127.0.0.1 --file=/usr/local/somefile --port=8090 --key-file=/usr/local/server.key

bash$ echo "${@/--file=\/usr\/local\/somefile/}"
mycommand --address=127.0.0.1  --port=8090 --key-file=/usr/local/server.key

对于更强大的解决方案,您可能希望将命令行转换为数组。

答案 3 :(得分:0)

这可能对您有用(GNU sed):

sed 's/--file=\S\+\s\?//' file

这将删除以--file=开头并以一个或非空格字符结尾的字符串,后跟一个可选空格。

sed -r 's/((--\S+\s?){3})--\S+\s?/\1/' file

这将删除以--开头的第四个字符串,后跟一个或多个非空格字符,后跟一个可能的空格。通过将前三个这样的字符串分组,然后再对另一个字符串进行分组,然后将匹配项替换为分组,来找到第四次匹配。

可以通过使用以下方法实现上述相反:

sed '/\n/!s/--\S\+/\n&\n/g;/^--file=/P;D' file

这会将每一行分割为以--开头的字符串,并打印以--file=开头的那一行。

sed '/\n/!s/--\S\+/\n&\n/g;/^--/{x;s/^/x/;/^x\{3\}$/{x;P;x};x};D' file

这将提取第三个选项。

sed '/\n/!s/--\S\+/\n&\n/g;/^--/{x;s/^/x/;/^x\{2,3\}$/{x;P;x};x};D' file

这将提取第二个和第三个选项。