2012-08-06 31 views
2

很抱歉,如果这听起来很愚蠢,原谅这个新手。
这里是我的代码不同的“替代”上相同的字符串/行一个命令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

感谢您的时间

+0

Bash参数替换不处理嵌套或组捕获,所以你必须诉诸管道或像sed这样的工具。 – Gingi 2012-08-06 17:54:02

+0

哦,我没有在原代码中使用回声..只是用来查看输出。 – stackex 2012-08-06 18:07:18

回答

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 -pattern从使用的分隔符在第二命令的|/

+0

非常感谢一群 – stackex 2012-08-06 17:47:50

+0

不是我。你可以像这样缩短:'echo $ {line // <> /;} | sed's/- > \ - < - // g'' – c00kiemon5ter 2012-08-06 17:53:22

+1

@ c00kiemon5ter是的,我想用'echo'来完成初始替换,但是显示'sed'的用法,我只用'echo'输出变量。我也可以完全跳过它并使用sed ... <<< $ line'。 – newfurniturey 2012-08-06 17:58:18

1

你不能用bash参数扩展在一行中完成所有操作,但是你可以使用bash的扩展模式匹配来同时删除< - 和 - >。

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

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

+0

谢谢!!我的双手无法接受多于一个答案 – stackex 2012-08-06 18:11:24

+0

另一个答案更好,因为我最初误解了你的问题,因为我们想消除'v2',而不是'v1'。我会留下这个答案,作为bash扩展模式的一个很好的例子,可能在其他时候派上用场。 – chepner 2012-08-06 18:16:31

相关问题