일반 텍스트 파일이 있습니다. 파일에는 다음과 같은 목록이 포함되어 있습니다.
@"Joe", @"211",
@"Bob Nelson", @"132",
@"Jack Sierra", @"3422",
@"Walt Robert", @"14",
목록에는 계속해서 수천 개의 이름이 포함되어 있습니다... 요소 순서를 전환하고 이 목록을 다음으로 변환해야 합니다.
@"211", @"Joe",
@"132", @"Bob Nelson",
@"3422", @"Jack Sierra",
@"14", @"Walt Robert",
터미널에서 이 작업을 어떻게 수행합니까?
답변1
이는 공백이 포함된 문자열에 대해 작동합니다.
sed 's/\(@"[^"]*"\), \(@"[^"]*"\)/\2, \1/' input.txt
작동 방식:
sed - (s)tream ( ed)itor는 입력의 각 줄에서 (s)ubstosute 명령을 실행
하고 이를 \(@"[^"]*"\), \(@"[^"]*"\)
.\2, \1
\2
두 번째 일치(두 번째 중괄호에서)는 첫 번째 일치(첫 번째 중괄호에서)를 의미
합니다 .\1
중괄호는 이스케이프되어야 하므로 \(
및 가 있습니다 \)
. 내부에서 @
문자를 찾은 다음 문자를 찾은 다음 "
언제든지 반복되는 [^"]
문자와 다른 문자를 찾은 "
다음 "
문자를 찾습니다.
,
그런 다음 쉼표 다음에 공백이 있고 이와 같은 두 번째 그룹이 올 것으로 예상합니다 \2
.
답변2
첫 번째 필드, 구분 기호 및 두 번째 필드를 일치시키고 역순으로 인쇄합니다. 큰따옴표 안에 쉼표가 있을 수 없다고 가정합니다.
sed -e 's/\(.*,\)\( \)\(.*,\)/\3\2\1/'
awk는 줄 끝에 쉼표가 있기 때문에 어색합니다. 그럼에도 불구하고 공백을 추가하거나 필드 구분 기호로 쉼표를 / +/
바꿀 수 있습니다.
awk -F ', ' '{print $2 " " $1 ","}'
따옴표 안에 쉼표가 있을 수 있는 경우 따옴표 이스케이프 규칙(있는 경우)을 고려하는 방식으로 필드를 일치시켜야 합니다.