如何在bash中用下划线和双引号替换空格

时间:2016-07-25 03:52:56

标签: bash sed

我的字符串如下:

$ echo "$val1"
"$29.95 Carryover Plan 1GB"

现在我可以使用此方法替换带下划线的空格

$ echo "NAME_"${val1// /_}"_NAME"
NAME_"$29.95_Carryover_Plan_1GB"_NAME

并且可以使用

替换"双引号
$ echo "NAME_"${val1//'"'/}"_NAME"
NAME_$29.95 Carryover Plan 1GB_NAME

现在我可以使用sed来做同样的事情 - 用下划线替换空格

$ echo "$val1" | sed s/" "/_/g
"$29.95_Carryover_Plan_1GB"

然后我可以通过添加此sed s/'"'/''/g

删除双引号
$ echo "$val1" | sed s/" "/_/g | sed s/'"'/''/g
$29.95_Carryover_Plan_1GB

所以这就是我想要的(用下划线和双引号删除的空格),但是我可以使用上面的第一种方法实现它,例如

$ echo "NAME_"${val1// /_}"_NAME"
NAME_"$29.95_Carryover_Plan_1GB"_NAME

这是我的尝试

$ echo "NAME_"${${val1// /_//'"'/}}"_NAME"
-sh: "NAME_"${${val1// /_//'"'/}}"_NAME": bad substitution

edit1 这是我能实现的sed,但我希望能够通过我的第一种方法实现这一目标

$ echo "NAME_"$val1"_NAME" | sed s/" "/_/g | sed s/'"'/''/g
NAME_$29.95_Carryover_Plan_1GB_NAME

2 个答案:

答案 0 :(得分:3)

无法在变量上嵌套字符串操作操作,因为${var/sub/rep}中的第一个参数是变量名,而不是字符串。

NAME='"$29.95 Carryover Plan 1GB"'
NAME=${NAME// /_}
NAME=${NAME//\"/}

巧合的是,sed是一种脚本语言;您可以在一个脚本中轻松执行多个替换。请参阅combining 2 sed commands

答案 1 :(得分:1)

抱歉,你不能。此外,所有命令中的引用都是错误的:

错:

$ echo "NAME_"${val1// /_}"_NAME"
NAME_"$29.95_Carryover_Plan_1GB"_NAME

右:

$ echo "NAME_${val1// /_}_NAME"
NAME_"$29.95_Carryover_Plan_1GB"_NAME

错:

$ echo "NAME_"${val1//'"'/}"_NAME"
NAME_$29.95 Carryover Plan 1GB_NAME

右:

$ echo "NAME_${val1//\"/}_NAME"
NAME_$29.95 Carryover Plan 1GB_NAME

错:

$ echo "$val1" | sed s/" "/_/g
"$29.95_Carryover_Plan_1GB"

右:

$ echo "$val1" | sed 's/ /_/g'
"$29.95_Carryover_Plan_1GB"

错:

$ echo "$val1" | sed s/" "/_/g | sed s/'"'/''/g
$29.95_Carryover_Plan_1GB

右:

$ echo "$val1" | sed 's/ /_/g; s/"//g'
$29.95_Carryover_Plan_1GB

错:

$ echo "NAME_"${val1// /_}"_NAME"
NAME_"$29.95_Carryover_Plan_1GB"_NAME

右:

$ echo "NAME_${val1// /_}_NAME"
NAME_"$29.95_Carryover_Plan_1GB"_NAME

错:

$ echo "NAME_"${${val1// /_//'"'/}}"_NAME"
-sh: "NAME_"${${val1// /_//'"'/}}"_NAME": bad substitution

右:

There is no right way to write that.

错:

$ echo "NAME_"$val1"_NAME" | sed s/" "/_/g | sed s/'"'/''/g
NAME_$29.95_Carryover_Plan_1GB_NAME

右:

$ echo "NAME_${val1}_NAME" | sed 's/ /_/g; s/"//g'
NAME_$29.95_Carryover_Plan_1GB_NAME

看看你是否可以在咬你之前找到关于shell引用的教程。