이 파일이 있어요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}'
제거되면 awk는 두 번째 필드를 인쇄한 다음 첫 번째 필드를 인쇄합니다 tr
. 입력 필드 구분 기호를 탭으로 \r
설정하고 -F"\t"
(한 줄에 2단어 이상이 허용되지 않는 한 이 작업을 수행할 필요가 없음) -vOFS=:\t"
출력 구분 기호를 탭으로 설정합니다.
답변4
패턴 그룹화를 사용하여 열을 캡처한 후 바꿀 수 있습니다.
sed 's/^\([^[:blank:]]\+\)\([[:blank:]]\+\)\([^[:blank:]]\+\).*/\3\2\1/' file.txt