Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从shell中的字符串中删除特定模式_Bash_Shell_Unix_Sed_Sh - Fatal编程技术网

Bash 从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

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

“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=""
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包含THIS1THIS2。但在脚本中,当我这样做

|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:]