bash变量内容是命令行参数,如下所示:
args="file-1.txt file-2.txt -k file-3.txt -k --some-argument-1 --some-argument-2"
字符串-k
可以出现在上面的字符串中的任何位置,还有一些其他参数不是-k
。
是否可以从参数中提取除-k
之外的所有字符串(即包含所有其他参数的文件名),并将其分配给bash变量?
答案 0 :(得分:2)
sed
是否可以从参数中提取除-k之外的所有字符串(即包含所有其他参数的文件名),并将其分配给bash变量?
我认为这意味着您要在保留其他所有内容的同时删除-k
。如果是这样的话:
$ new=$(echo " $args " | sed -e 's/[[:space:]]-k[[:space:]]/ /g')
$ echo $new
file-1.txt file-2.txt file-3.txt --some-argument-1 --some-argument-2
这个问题用bash标记。在bash下,不需要使用sed:
$ new=" $args "
$ new=${new// -k / }
$ echo $new
file-1.txt file-2.txt file-3.txt --some-argument-1 --some-argument-2
答案 1 :(得分:1)
将其管道到sed
应该有效:
echo $args | sed -e 's/[[:space:]]\-[[:alnum:]\-]*//g'
file-1.txt file-2.txt file-3.txt
您可以将其分配给变量:
newvar=`echo $args | sed -e 's/[[:space:]]\-[[:alnum:]\-]*//g'`
答案 2 :(得分:1)
bash
中的命令行参数应存储在数组中,以允许包含需要引用的字符的参数。
args=(file-1.txt file-2.txt -k file-3.txt -k --some-argument-1 --some-argument-2)
要提取-k
以外的字符串,只需使用for循环过滤它们。
newargs=()
for arg in "${args[@]}"; do
[[ $arg = "-k" ]] && newargs+=("$arg")
done