获取两个字符之间的字符串,并使用逗号作为分隔符输出字段

时间:2017-05-29 10:38:57

标签: bash sed grep

我有以下字符串:

::

我想要+之间的所有内容,删除1,2,3,4,5,-7,-6 符号,并使用逗号作为分隔符编写数字,在开头或结尾没有空格或逗号:

echo ":: +1 +2 +3 +4 +5 -7 -6  :: 7 cycles" | sed -e 's/.*::\(.*\)::.*/\1/' | sed -e 's/+//g' -e 's/ /,/g'

我尝试了以下内容:

{{1}}

它还没有。关键是虽然在这里我有7个字段(数字),但在我的工作中,字段的数量可能会有所不同所以我不能只打印字段 awk声明。它需要一个适用于任意数量字段的解决方案。

4 个答案:

答案 0 :(得分:3)

使用awk,您可以使用::(由空格和/或加号包围)作为输入字段分隔符轻松完成:

s=":: +1 +2 +3 +4 +5 -7 -6  :: 7 cycles"
awk -F '[+ ]*::[ +]*' '{gsub(/[+ ]+/, ",", $2); print $2}' <<< "$s"

1,2,3,4,5,-7,-6

答案 1 :(得分:2)

使用perl

$ echo ':: +1 +2 +3 +4 +5 -7 -6  :: 7 cycles' |
  perl -F:: -lane 'print join ",", $F[1] =~ /-?\d+/g'
1,2,3,4,5,-7,-6
  • -F::::设置为字段分隔符,结果保存在@F数组
  • $F[1]这是@F数组的第二个元素,将包含 +1 +2 +3 +4 +5 -7 -6
  • $F[1] =~ /-?\d+/g将返回带有可选-前缀
  • 的所有数字
  • join ","会在提取的字符串之间添加,
  • 有关-lane选项
  • 的详细信息,请参阅https://perldoc.perl.org/perlrun.html#Command-Switches

答案 2 :(得分:1)

Pure Bash:使用参数扩展(使用扩展的globs):

# Turn on extglobs
shopt -s extglob

s=":: +1 +2 +3 +4 +5 -7 -6  :: 7 cycles"

# Remove leading colons (and spaces following them)
s1=${s##::*([[:space:]])}

# Remove trailing colons (and spaces leading them)
s2=${s1%%*([[:space:]])::*}

# Remove all + signs
s3=${s2//+}

# Replace all spaces by commas
s4=${s3//+([[:space:]])/,}

# Done
echo "$s4"

答案 3 :(得分:0)

gawk 解决方案:

FPAT="[+-][0-9]+"
  • + - 表示字段值的模式(即前面有-gsub(/^+/,"",$i)的数字

  • + - 在号码前删除可能的sed 's/::\(.*\)::.*/\1/; s/ \([+-]\)/,\1/g; s/^,+\|+//g' <<< $s 1,2,3,4,5,-7,-6

sed 方法:

s/::\(.*\)::.*/\1/
  • :: - 捕获1,2,3,4,5,-7,-6
  • 之间的所有内容

输出(两种方法):

click