我有这个文件http://sinivalkoiset.wz.cz/ostatni/finnish-czech.txt 我想将第一列与第二列交换。我使用了 sed 推荐
sed -ne 's/\([^a-z A-Z].*\) \(.*\)$/\2 \1/ p' finnish-czech.txt
第二个反向引用有效,但第一个反向引用无效。我使用“空格”作为反向引用的结尾。但后来我意识到它不会那样工作,因为有些单词包含两个单词。
答案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}'
删除后tr
,\r
awk 将打印第二个字段,然后打印第一个字段。将-F"\t"
输入字段分隔符设置为制表符(除非每行可以有超过 2 个单词,否则不需要这样做)并将-vOFS=:\t"
输出分隔符设置为制表符。
答案4
您可以使用模式分组来捕获列,然后替换它们:
sed 's/^\([^[:blank:]]\+\)\([[:blank:]]\+\)\([^[:blank:]]\+\).*/\3\2\1/' file.txt