如何在bash中清理以下行
-,2,8,--,-,2,6,--,-,-1,2,--,-,0,4,--,-,1,5,--,-,-5,2
以获得
2,8,2,6,-1,2,0,4,1,5,-5,2
我只想要用逗号分隔的正数和负数
答案 0 :(得分:2)
您可以通过此sed
脚本运行它:
sed -e 's/--*,//g' -e 's/,--*$//'
消除由一个或多个减号(-
)组成的每个子字符串,后跟一个逗号(,
),以及另外一个由逗号后跟一个或多个组成的尾随子字符串减号。
答案 1 :(得分:1)
gnu-awk解决方案:
str='-,2,8,--,-,2,6,--,-,-1,2,--,-,0,4,--,-,1,5,--,-,-5,2'
awk -v FPAT='-?[0-9]+' '{for(i=1; i<=NF; i++) printf "%s%s", $i, (i<NF)?",":RS}' <<< "$str"
2,8,2,6,-1,2,0,4,1,5,-5,2
非gnu awk解决方案:
str=$(awk 'BEGIN{RS=ORS=","} /^-?[[:digit:]]+/{print $1}' <<< "$str")
输出:
echo "${str%,}"
2,8,2,6,-1,2,0,4,1,5,-5,2
答案 2 :(得分:0)
尝试:
egrep -o "\-?[0-9]+" | sed ':a;N;$!ba;s/\n/,/g'
或:
egrep -o "\-?[0-9]+" | xargs | sed 's/ /,/g'
答案 3 :(得分:0)
$ awk 'BEGIN{FS=OFS=","} {j=0; for (i=1;i<=NF;i++) if ($i~/^-?[0-9]/) printf "%s%s", (++j>1?OFS:""), $i; print ""}' file
2,8,2,6,-1,2,0,4,1,5,-5,2
循环遍历每个字段,测试当前字段是否可选地以-
开头。如果是,那么如果它是行上的第一个匹配字段或输出字段分隔符,则打印前面没有任何内容的字段。完成打印后,字段会打印换行符。