2017-05-29 103 views
2

我有以下字符串:得到兩個字符和輸出字段之間的字符串逗號作爲分隔符

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

我想::之間的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' 

它還沒有。問題是,雖然在這裏我有7個字段(數字),但在我的工作中,字段數量可能會有所不同,因此我不能僅使用 awk語句打印字段。它需要一個適用於任何領域的解決方案。

回答

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 
+0

這很有趣。是否可以在同一命令中刪除第一個和最後一個逗號?因此,只有1,2,3,4,5,-7,-6? – Homap

+0

是的,現在查看我更新的答案。 – anubhava

+0

爲什麼你有雙星號? – 123

0

呆子溶液:

s=":: +1 +2 +3 +4 +5 -7 -6 :: 7 cycles" 
awk -v FPAT="[+-][0-9]+" '{ r=""; 
     for(i=1;i<=NF;i++){ gsub(/^+/,"",$i); r= (r)? r","$i : $i } print r}' <<< $s 
  • FPAT="[+-][0-9]+" - 表示字段val的模式ue(即與前述+-

  • gsub(/^+/,"",$i)一個數字 - 若干


sed的前去除可能+方法:

sed 's/::\(.*\)::.*/\1/; s/ \([+-]\)/,\1/g; s/^,+\|+//g' <<< $s 
1,2,3,4,5,-7,-6 
  • s/::\(.*\)::.*/\1/ - 捕獲一切::

    輸出(對於這兩種方法)之間


1,2,3,4,5,-7,-6 
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 ","將增加所提取的字符串之間,
  • 有關詳細信息,請參見https://perldoc.perl.org/perlrun.html#Command-Switches-lane選項
1

Pure Bash:使用參數擴展(使用擴展小球):

# 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"