bash-字符串操作后修剪输入

时间:2018-07-16 17:00:26

标签: bash trim

这是我的输入内容:

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"

5 个答案:

答案 0 :(得分:1)

我认为了解中的双引号具有特殊含义很重要。

  1. string="a 1,a 2,a 3"代表字符串a 1,a 2,a 3(不带引号)
  2. 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 "之间,就可以得到想要的。假设您的模式始终在stringnumber值之间遵循一个空格。

答案 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"
  

这件事必须要做,因为地形期望列表   这样传递的变量。它们必须用双引号(“”)括起来,   在方括号([])中以逗号(,)分隔。