从bash变量中删除子字符串

时间:2014-10-20 00:46:13

标签: bash

bash变量内容是命令行参数,如下所示:

args="file-1.txt file-2.txt -k file-3.txt -k --some-argument-1 --some-argument-2"

字符串-k可以出现在上面的字符串中的任何位置,还有一些其他参数不是-k

是否可以从参数中提取除-k之外的所有字符串(即包含所有其他参数的文件名),并将其分配给bash变量?

3 个答案:

答案 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标记。在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