从shell中的字符串中删除特定模式

时间:2016-11-04 11:35:51

标签: bash shell unix sed sh

原始字符串是(根据我的格式)

  

“cf foo -J 12345 -z -macro TEST_IFDEFINE -macro   这个-macro THIS1 -macro THIS2“

为了将它传递给另一个脚本,我试图将其修改为

  

“cf foo -J 12345 -z”

为实现这一目标,我编写了如下shell脚本:

string="cf foo -J 12345 -z -macro TEST_IFDEFINE -macro THIS -macro THIS1 -macro THIS2"
done=0
config="-cf"
name=""
for name in $string
do
  if [ $done -eq 1 ];then
    string=`echo $string | sed s/"-macro"//g`
    string=`echo $string | sed s/"$name"//g`
    echo "----->name: $name"
    macro_name="$macro_name -d $name"
    done=0
    echo "----->string: $string"
  fi
  if [ "$name" = "-macro" ];then
    done=1
    macro_def=1
  fi
done 

从这段代码我得到的输出是:

  

cf foo -J 12345 -z 1 2

此处, $ name 包含 THIS1 THIS2 。但是在我做脚本时

  

| sed s /“$ name”// g`

仅删除

  

'这个'

但保持

  

1 2

连同原始字符串。 这意味着脚本只丢弃字母而不是$ name中的数字值。 建议我实现这一目标。

2 个答案:

答案 0 :(得分:2)

如果你想删除-macro WORD的所有块,只需这样说:

$ sed 's/\s-macro \S*//g' <<< "cf foo -J 12345 -z -macro TEST_IFDEFINE -macro THIS -macro THIS1 -macro THIS2"  | cat -vet -
cf foo -J 12345 -z$
  • \s-macro \S*匹配space + -macro +空格+ a word
  • sed 's/something//g'删除此something次数与字符串中的次数相同。

答案 1 :(得分:2)

启用扩展模式后,您可以使用单个参数扩展。

$ shopt -s extglob
$ foo="cf foo -J 12345 -z -macro TEST_IFDEFINE -macro THIS keepme -macro THIS1 -macro THIS2 keepme"
$ echo "${foo//-macro +([[:alnum:]_])}?( )"
cf foo -J 12345 -z keepme keepme2

+([[:alnum:]_])匹配一个或多个字母,数字或_,我认为这是宏名称的定义。 ?( )删除宏名称后面的可选尾随空格。 (在最终-macro后面没有空格的意义上是可选的。)