2014-10-29 39 views
1

我需要找到與1,替換文件中的每一行的,首次亮相,如:如何查找並替換BASH中每個文件行中的第一個匹配模式?

0001,mountain,a big rock 
0002,tree,a tall plant 
0003,whale,a big fish 
0004,lion,a big cat 
0005,iPhone,a small computer 

輸出將如下所示:

00011,mountain,a big rock 
00021,tree,a tall plant 
00031,whale,a big fish 
00041,lion,a big cat 
00051,iPhone,a small computer 

我所知道的唯一的解決方案涉及使用while循環,需要很長的時間來處理長文件:

while read -r line 
do 
    sed -i 's/,/1,/' file.csv 
done < file.csv 

如何查找和repl在文件中的每一行上啓動一個模式的第一次匹配?

+3

while循環是沒有意義的。這完全不需要。只需使用sed命令。 – ooga 2014-10-29 22:48:44

回答

4

循環是不必要的。只需運行不帶循環的sed命令,它將一次處理整個文件。

sed -i 's/,/1,/' file.csv 
2

你可以做到這一點在純擊:

new_lines=() 
while IFS= read -r line || [[ $line ]] ; do 
    new_lines+=("${line/,/1,}") 
done <file.csv 
printf '%s\n' "${new_lines[@]}" >file.csv 

組IF,並使用「-r」選項來「讀」,以確保線路正確讀取。

測試'[[$ line]]'允許'讀取'在讀取未終止的最終行後返回FALSE。

但是,這個解決方案將整個文件讀入內存,Cygwin的基準測試表明它比純粹的'sed'解決方案慢100倍。這可能只適用於長達一萬行的文件。

如果您正在處理非常大的文件,其他工具可能會比'sed'快得多。一個可能的「Perl的解決方案是:

perl -i -ple 's/,/1,/' file.csv 
1

您可以通過AWK也做到這一點,

$ awk '{sub(/,/,"1,")}1' file 
00011,mountain,a big rock 
00021,tree,a tall plant 
00031,whale,a big fish 
00041,lion,a big cat 
00051,iPhone,a small computer 
2

既然要編輯文件,爲什麼不使用ed,標準編輯?

ed -s file < <(printf '%s\n' ',s/,/1,/' 'wq') 

,s/,1,/告訴ed到每行上執行替換s/,/1,/,是整個文件1,$的簡寫)。然後,w儀式和q的任務。

如果你不喜歡的進程替換bashism <(...)(但你爲什麼不喜歡呢?),

printf '%s\n' ',s/,/1,/' 'wq' | ed -s file 
相關問題