Bash 从shell中的字符串中删除特定模式
原始字符串是(根据我的格式) “cf foo-J 12345-z-宏测试\u IFDEFINE-宏 此-宏THIS1-宏THIS2“ 为了将其传递给另一个脚本,我正在尝试将其修改为 “cf foo-J 12345-z” 为了实现这一点,我编写了如下shell脚本:Bash 从shell中的字符串中删除特定模式,bash,shell,unix,sed,sh,Bash,Shell,Unix,Sed,Sh,原始字符串是(根据我的格式) “cf foo-J 12345-z-宏测试\u IFDEFINE-宏 此-宏THIS1-宏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="" fo
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 12
在这里,$name包含THIS1和THIS2。但在脚本中,当我这样做
|sed s/“$name”//g`
它只删除
‘这’
但是保持
1 2
与原始字符串一起。
这意味着脚本在$name中只丢弃字母表而不是数字值。
建议我做些什么来实现这一点。如果你想删除
-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$
$sed's/\s-macro\s*//g'如果要删除-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$
$sed's/\s-macro\s*//g'启用扩展模式后,可以使用单个参数扩展
$ 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:].
匹配一个或多个字母、数字或.
,我假设这是宏名称的定义<代码>?()
删除宏名称后面的可选尾随空格。(可选,因为最终的-宏
后面没有空格。)启用扩展模式后,可以使用单个参数展开
$ 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
后面没有空格。)清理字符串的逻辑是什么?保留前5个单词?所有操作都在宏中进行?不。。。逻辑是删除字符串“-macro”,后跟宏名称。在这种情况下,它是“-macro this-macro THIS1-macro THIS2”清理字符串的逻辑是什么?保留前5个单词?所有操作都在宏中进行?不。。。逻辑是删除字符串“-macro”,后跟宏名称。在这种情况下,它是“-macro this-macro THIS1-macro THIS2”并非所有的sed
方言都接受Perl正则表达式\s
,但是任何合理的现代sed
都应该理解事实上的同义词[:space:][/code>和正交[^[:space:]并非所有的sed
方言都接受Perl正则表达式\S
,但是任何合理的现代sed
都应该理解事实上的同义词[[:space:]
和\S
的正交[^[:space:]
。