ファイルを 1 行ずつ読み取り、各行を編集して、それらの行を別のファイルに保存します。
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
または を使用できると読みましたがsed -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
で述べたように、を使うこともできます。stdinまたはファイルをバッファリングできるプログラム入力がリダイレクトされるのと同じ方法で、ループ全体をパイプすることができます。
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]}
- ソートされた単語を1行に連結する