다음과 같은 줄이 많은 파일을 얻습니다.
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