我想从下面的命令中删除一个特定的参数,
mycommand --address=127.0.0.1 --file=/usr/local/somefile --port=8090 --key-file=/usr/local/server.key
在这种情况下,我想删除--file=/usr/local/somefile
,如何将--file=
中的文本与下一个--
或使用{ {1}}。
答案 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
这将提取第二个和第三个选项。