我有以下字符串:
::
我想要+
之间的所有内容,删除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声明。它需要一个适用于任意数量字段的解决方案。
答案 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
选项答案 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