原始字符串是(根据我的格式)
“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中的数字值。 建议我实现这一目标。
答案 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
后面没有空格的意义上是可选的。)