繁体   English   中英

从Shell脚本的另一个字符串中剪切并删除一个字符串

[英]Cut and remove a string from another string in shell script

我在shell脚本中有以下字符串。

var="rule:access=allow,default=default value,OTHER=0,SOMETHING=1"

我需要从$ var中删除“ default = default value”。 因此,最终的字符串将如下所示:

var="rule:access=allow,OTHER=0,SOMETHING=1"

注意:默认值之后的值可以是任何值。 它可能是“默认值=其他”。 它不是固定的。 我需要删除该文本。 如何才能做到这一点?

修订问题的答案

$ echo "$var" | sed 's/default=[^,]*,//'
rule:access=allow,OTHER=0,SOMETHING=1

如果要更新var的值,则使用命令替换

$ var="$(echo "$var" | sed 's/default=[^,]*,//')"
$ echo "$var"
rule:access=allow,OTHER=0,SOMETHING=1

回答原始问题

使用bash

要删除default=default value, ,请使用模式替换

$ var="${var/default=default value,/}"
$ echo "$var"
rule:access=allow,OTHER=0,SOMETHING=1

man bash记录了此功能:

$ {参数/模式/字符串}
模式替换。 与路径名扩展一样,扩展模式以产生模式。 扩展参数,并将模式与其值的最长匹配项替换为字符串。 如果pattern以/开头,则pattern的所有匹配项都将替换为字符串。 通常只替换第一个比赛。 如果pattern以#开头,则它必须与参数的扩展值的开头匹配。 如果模式以%开头,则它必须与参数扩展值的末尾匹配。 如果string为null,则删除模式匹配项,并且/后面的模式可以省略。 如果parameter为@或*,则将替换操作依次应用于每个位置参数,并且扩展为结果列表。 如果parameter是用@或*下标的数组变量,则将替换操作依次应用于数组的每个成员,并且扩展为结果列表。

使用sed

$ var="$(echo "$var" | sed 's/default=default value,//')"
$ echo "$var" 
rule:access=allow,OTHER=0,SOMETHING=1

再次将此分配给var

echo $var|sed 's/default=default value//'|sed 's/,,/,/'

Last sed用于处理default=default value字符串中第一个或最后一个关键字的情况。

您可以使用两种参数扩展,一种用于获取default=*逗号之后的内容,另一种用于获取default ...之前的部分。

var="rule:access=allow,default=default value,OTHER=0,SOMETHING=1"

endo=${var#*default}
echo ${var/default=*}${endo#*,}

rule:access=allow,OTHER=0,SOMETHING=1

但是sed可能更容易...!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM