这是我的输入内容:
string="a 1,a 2,a 3"
这是我从输入中生成列表的方法:
sed -e 's/[^,]*/"&"/g' <<< ${string}
以上命令为我提供了所需的输出:
"a 1","a 2","a 3"
如何修剪每个元素,以便如果输入为" a 1, a 2, a 3"
,我的输出仍会返回为"a 1","a 2","a 3"
?
答案 0 :(得分:1)
我认为了解bash中的双引号具有特殊含义很重要。
string="a 1,a 2,a 3"
代表字符串a 1,a 2,a 3
(不带引号)sed -e 's/[^,]*/"&"/g' <<< ${string}
等同于变量out='"a 1","a 2","a 3"'
要完成您想要的,您可以:
$ string=" a 1, a 2, a 3 "
$ echo "\"$(echo ${string//*( ),*( )/\",\"})\""
"a 1","a 2","a 3"
这仅使用bash内置操作。
${string//*( ),*( )/\",\"}
替换多个空格和逗号的所有组合$(echo ...)
(注意:这有点难看,在a 1 , a 2
之类的情况下会失败,因为它将删除{{ 1}}和a
) 更好的方法是使用双替换:
1
注意:,此处我们使用KSH-glob,可以通过 extglob 设置($ string=" a 1, a 2, a 3 "
$ foobar="\"${string//,/\",\"}\""
$ echo "${foobar//*( )\"*( )/\"}"
"a 1","a 2","a 3"
)启用该功能
答案 1 :(得分:0)
编辑: :由于OP要求将输出包装在"
中,因此请立即添加。
echo "$string" | sed -E 's/^ +/"/;s/$/"/;s/, +/"\,"/g'
输出如下。
echo "$string" | sed -E 's/^ +/"/;s/$/"/;s/, +/"\,"/g'
"a 1","a 2","a 3"
能否请您尝试以下操作,如果有帮助,请告诉我。
awk '{sub(/^\" +/,"\"");gsub(/, +/,"\",\"")} 1' Input_file
如果要将输出保存到相同的Input_file本身,请在> temp_file && mv temp_file Input_file
后面附加
解决方案第二: 使用sed
。
sed -E 's/^" +/"/;s/, +/"\,"/g' Input_file
答案 2 :(得分:0)
以下是答案,它通过一些基本的预处理扩展了sed命令,从而消除了多余的空格:
sed -E -e 's/ *(^|,) */\1/g;s/[^,]*/"&"/g' <<< ${string}
-E
选项启用扩展的正则表达式,从而节省了一些\
。
答案 3 :(得分:0)
您可以使用grep -ow
选项来代替复杂的sed模式。
[nooka@lori ~]$ string1="a 1,a 2,a 3"
[nooka@lori ~]$ string2=" a 1, a 2, a 3, a 4"
[nooka@lori ~]$
nooka@lori ~]$ echo $(echo $string1 | grep -ow "[a-zA-Z] [0-9]"|sed "s/^/\"/;s/$/\"/")|sed "s/\" /\",/g"
"a 1","a 2","a 3"
[nooka@lori ~]$ echo $(echo $string2 | grep -ow "[a-zA-Z] [0-9]"|sed "s/^/\"/;s/$/\"/")|sed "s/\" /\",/g"
"a 1","a 2","a 3","a 4"
1)使用grep -ow
按照上述模式仅获取那些单词。您可以根据需要调整模式(例如[a-zA-Z] [0-9] [0-9] *等),以了解更多模式情况。
2)然后,使用第一个sed cmd用"
包装输出(a或2等)。
3)然后,您只需将,
放在2 "
之间,就可以得到想要的。假设您的模式始终在string
和number
值之间遵循一个空格。
答案 4 :(得分:0)
好的。终于成功了。
string=" a 1 b 2 c 3 , something else , yet another one with spaces , totally working "
trimmed_string=$(awk '{gsub(/[[:space:]]*,[[:space:]]*/,",")}1' <<< $string)
echo ${trimmed_string}
a 1 b 2 c 3,something else,yet another one with spaces,totally working
string_as_list=$(sed -e 's/[^,]*/"&"/g' <<< ${trimmed_string})
echo ${string_as_list}
"a 1 b 2 c 3","something else","yet another one with spaces","totally working"
这件事必须要做,因为地形期望列表 这样传递的变量。它们必须用双引号(“”)括起来, 在方括号([])中以逗号(,)分隔。