在一个命令shell脚本中对同一个字符串/行进行不同的“替换”

时间:2012-08-06 17:34:06

标签: bash shell

对不起,如果这听起来很愚蠢,请原谅这个新手 这是我的代码

line="abcd<>efgh->higk<-1234"
v1=$(echo ${line//<>/;})
echo $v1                   --> outputs "abcd;efgh->hijk<-1234"
v2=$(echo ${v1//->/})  
echo $v2                   --> output "abcd;efghhijk<-1234"
echo ${$v2//<-/}           --> output "abcd;efghhijk1234"

没有将输出存储到中间变量我可能知道如何实现此输出 的 ABCD; efghhijk1234

感谢您的时间

2 个答案:

答案 0 :(得分:3)

您可以使用sed和管道|来分隔替换命令:

line="abcd<>efgh->highk<-1234"
v1=$(echo ${line} | sed 's|<>|;|g' | sed 's|->||g' | sed 's|<-||g')
echo $v1

以上将输出所请求的abcd;efghhijk1234

或者,如果您不想使用多个sed命令,可以将它们全部与-e选项结合使用:

v1=$(echo $line | sed -e 's/<>/;/g' -e 's/->\|<-//g');

注意:我已将sed模式中使用的分隔符更改为第二个命令中的|/

答案 1 :(得分:1)

你不能用bash参数扩展在一行中完成所有操作,但你可以利用bash的扩展模式匹配来删除&lt; - 和 - &gt;在同一时间。

shopt -s extglob
line="abcd<>efgh->higk<-1234"
v1=${line//<>/;}
v2=${v1//@(->|<-)}

由于两个项目都被替换为相同的替换文本(空字符串),因此您可以匹配其中任何一个的所有匹配项。