如何用bash替換每行文本文件中逗號的最後六個空格?用逗號替換後六個空格
我:
$cat myfile
foo bar foo 6 1 3 23 1 20
foo bar 6 1 2 18 1 15
foo 5 5 0 15 1 21
我要的是:
$cat myfile
foo bar foo,6,1,3,23,1,20
foo bar,6,1,2,18,1,15
foo,5,5,0,15,1,21
任何幫助表示讚賞!謝謝!
如何用bash替換每行文本文件中逗號的最後六個空格?用逗號替換後六個空格
我:
$cat myfile
foo bar foo 6 1 3 23 1 20
foo bar 6 1 2 18 1 15
foo 5 5 0 15 1 21
我要的是:
$cat myfile
foo bar foo,6,1,3,23,1,20
foo bar,6,1,2,18,1,15
foo,5,5,0,15,1,21
任何幫助表示讚賞!謝謝!
它看起來像規則可能是一個逗號數字前替換任何空間:
sed 's/ \([0-9]\)/,\1/g' file
或者,下面您的規格(更換最後六個空格),你可以去這樣的事情:
awk '{for(i=1; i<=NF; ++i)printf "%s%s", $i, (i<NF-6?FS:(i<NF?",":RS))}' file
此遍歷字段中輸入,打印每一個後跟一個空格(FS
),逗號或換行符(RS
),這取決於它是將線的端部的距離。
更完整的加REV(反向)的sed可能
rev myfile | sed 's/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/; s/ /,/' | rev
爲當然的第一OCCURENCES SED部分如果需要可以簡化!
這可能爲你工作(GNU SED):
sed -r ':a;s/(.*) /\1,/;x;s/^/x/;/^x{6}/{z;x;b};x;ba' file
它使用貪婪找上一行的最後一個空間,然後跟蹤通過保持一個計數器在保持空間代替空格數的。
有趣的解決方案,順便說一句這是什麼{z; x; b}(順便說一句,是從我這裏)。更加珍貴的是那裏有什麼z和b? – josifoski
@josifoski'z'參見[here](http://www.gnu.org/software/sed/manual/sed.html#Extended-Commands))用於從保留空間中刪除所有字符,即重置計數器。 'b'是sed中的'goto'命令,沒有佔位符,它充當斷點命令,即沒有進一步的sed命令被處理。 – potong
tnx解釋,只有很小的更正,z是重新設置模式空間,因爲你正確使用(不保留)(來自你已發佈的鏈接) – josifoski
此解決方案不能很好地擴展。或者,您可以用換行符替換第六個換行符後的所有空格,然後用逗號替換左側空格,並反向第一個替換,如:'rev myfile | sed's// \ n/7g; s//,/ g; s/\ n// g'| rev' – Birei
更優雅我承認是7g的想法 – josifoski