2

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

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

谢谢你的时间

4

2 回答 2

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 中使用的分隔符从 a|更改为 a 。/

于 2012-08-06T17:45:55.690 回答
1

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

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

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

于 2012-08-06T17:57:53.140 回答