이 경우 이름과 성을 어떻게 바꾸나요?

이 경우 이름과 성을 어떻게 바꾸나요?

다음과 같은 줄이 많은 파일을 얻습니다.

Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900

이름 성에서 성, 이름 순서를 변경해야 합니다. 여기까지 왔지만 여전히 오류가 발생합니다.

sed -e "s/\([^ ]*\) *\(^ ]*\)/\2 \1 /g" datebook

하지만 다음과 같이 출력됩니다.

Tranh:438-910-7449:8235 Vinh Maple Street...

바꾸다

Tranh, Vinh:438-910...

답변1

편집하다:나는 원래 질문을 오해했으며 거의 ​​올바른 BRE 구문을 사용했다는 것을 보지 못했습니다. 그 의미는...

정규식에 몇 가지 문제가 있습니다.

  • 두 번째 캡처 그룹에는 이 없습니다 [(비록 이 없이는 얻을 수 없는 일부 출력을 게시했기 때문에 이것은 단지 기록 문제일 수 있지만 [).
  • 두 번째 캡처 그룹과 두 번째 단어만 일치시키려면 첫 번째 콜론 앞의 마지막 문자를 일치시키려고 할 것입니다. 즉, :두 번째 캡처 그룹에서 제외하려는 것입니다.
  • g첫 번째 게임에만 관심이 있으므로 최종 플래그가 필요하지 않습니다 . 이를 포함하면 sed표현을 나머지 줄과 일치시키려고 시도하여 엉망이 될 수도 있습니다.

참고로 sed옵션이 아닌 인수를 두 개만 제공했기 때문에 이 -e옵션은 필수가 아닙니다. 첫 번째 옵션이 아닌 인수는 해석될 스크립트로 처리됩니다.

수정된 명령 버전:

sed -e "s/\([^ ]*\) *\([^ :]*\)/\2, \1/"

(역참조 뒤의 공백을 제거 하고 제공한 예제 출력과 일치하도록 \1그 뒤에 쉼표를 추가했습니다 ). 원시 텍스트에 적용하면 결과가 나타납니다.\2

$ echo "Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900" |
sed -e "s/\([^ ]*\) *\([^ :]*\)/\2, \1/"
Tranh, Vinh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900

답변2

나는 이것이 효과가 있을 것이라고 믿는다.

sed 's?^\([[:alpha:]]\{1,\}\)[[:blank:]]\([[:alpha:]]\{1,\}\)?\2, \1?g'

어디,

  • SED 구분 기호 -> ( 등 ?으로 대체 가능 )/:
  • POSIX 클래스 -> [:alpha:]= [A-Za-z](알파벳순)
  • POSIX 클래스 -> [:blank:]= [\s\t](공백 및 탭)
  • 적어도 하나 이상 ->{1,}
  • 그룹 1->\([[:alpha:]]\{1,\}\)
  • 두 번째 그룹->\([[:alpha:]]\{1,\}\)

[arif@arif test]$ echo "Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900" | sed 's?^\([[:alpha:]]\{1,\}\)[[:blank:]]\([[:alpha:]]\{1,\}\)?\2, \1?'
Tranh, Vinh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900

답변3

$ echo "Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900"| sed 's/:/ /1'| awk '{$30=$1;$1=$2;$2=$30;print $0}'| sed "s/ /,/1"| sed "s/ /:/1"
Tranh,Vinh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900                      Vinh

관련 정보