このファイルがあります。http://sinivalkoiset.wz.cz/ostatni/finnish-czech.txt 最初の列を2番目の列に置き換えたいです。私はsedの推薦を使用しました
sed -ne 's/\([^a-z A-Z].*\) \(.*\)$/\2 \1/ p' finnish-czech.txt
2番目の逆参照は有効ですが、最初の逆参照は無効です。私は逆参照の終わりに「スペース」を使用します。しかし、ある単語には2つの単語が含まれているので、そのように動作しないことに気づきました。
答え1
何か提案してもいいですかawk
?
awk 'BEGIN {OFS=FS="\t"} {sub(/\r/, ""); print $2,$1}' finnish-czech.txt
これにより、ファイルからWindowsキャリッジリターンも削除されます。
答え2
他の言語の単語はスペースではなくタブで区切られます。 Sedはタブを処理しませんが、$'\t'
bashで使用できます。
sed -e 's/\(.*\)'$'\t''\(.*\)/\2'$'\t''\1/' finnish-czech.txt
dos2unix
ただし、それを行う前に、ファイルからWindows行末を実行または削除して削除してくださいfromdos
。
答え3
ファイルにはWindowsスタイルの行末があります。これは状況を混乱させる可能性があります。また、先頭にいくつかの追加文字があります。
$ wget -O - http://sinivalkoiset.wz.cz/ostatni/finnish-czech.txt 2>/dev/null | head -n1 | od -c
0000000 357 273 277 A f r i k k a \t A f r i k
0000020 a \r \n
0000023
とにかく、あまり依存していない場合は、sed
この種のものを使いやすいですawk
。
tr -d $'\r' < finnish-czech.txt | awk -F"\t" -vOFS="\t" '{print $2,$1}'
削除すると、awkは2番目のフィールドを印刷してから1番目のフィールドを印刷しますtr
。入力フィールド区切り文字をタブに\r
設定し-F"\t"
(1行に2単語以上が許可されていない限り、これを行う必要はありません)、-vOFS=:\t"
出力区切り文字をタブに設定します。
答え4
パターングループ化を使用して列をキャプチャしてから置き換えることができます。
sed 's/^\([^[:blank:]]\+\)\([[:blank:]]\+\)\([^[:blank:]]\+\).*/\3\2\1/' file.txt