我逐行讀取文件並編輯每一行並將這些行保存在單獨的文件中。
while read -r line
do
newline=$(echo $line | sed -r 's/\</\n/g' | sort | tr '\n' ' ')
echo "$newline" >> newfile
done < "$filename"
但我想用$filename
新線替換原來的線。我讀到我可以使用cat filename... | xargs -n1 command
orsed -i ...
但到目前為止我的踪跡都失敗了。
這是一個輸入範例:
1.e4 e5 2.Nf3 Nc6 3.
1.d4 d5 2.e4 dxe4 3.
1.e4 e5 2.Nf3 Nf6 3.
這是預期的輸出:
1. 2. 3. e4 e5 Nc6 Nf3
1. 2. 3. d4 d5 dxe4 e4
1. 2. 3. e4 e5 Nf3 Nf6
答案1
您可以使用sponge
,如中所述可以緩衝標準輸入或檔案的程序。您可以透過管道將整個循環傳遞給它,就像將輸入重定向到它一樣:
while read -r line ; do
echo "$line" | sed -r 's/\</\n/g' | sort | tr '\n' ' ' ;
echo
done < filename | sponge filename
對於 Perl,可以這樣做(空白的數量不同):
perl -Mlocale -i -lne 'print join " ", sort split/(?<=\.)| /' filename
答案2
awk方法:
awk 'BEGIN{IGNORECASE=1;}{ gsub(/\./,". ", $0); split($0, w, " ");
asort(w);l=""; for(i in w) {l=l" "w[i]} print l}' file
輸出:
1. 2. 3. e4 e5 Nc6 Nf3
1. 2. 3. d4 d5 dxe4 e4
1. 2. 3. e4 e5 Nf3 Nf6
忽略大寫可以在命令列或在開始規則
split($0, w, " ");
- 將行分割成單獨的單字
asort(w);
- 對數組值(單字)進行排序
for(i in w) {l=l" "w[i]}
- 將排序後的單字連接成一行