sed와 여러 구분 기호를 사용하여 두 단어를 바꾸는 방법은 무엇입니까?

sed와 여러 구분 기호를 사용하여 두 단어를 바꾸는 방법은 무엇입니까?

단어에는 문자만 허용되며 다른 문자는 구분 기호입니다. 첫 번째 단어를 세 번째 단어로 바꾸고 싶습니다.

sed -E 's/([A-Za-z]+) [^A-Za-z] ([A-Za-z]+) [^A-Za-z] ([A-Za-z]+)/\3 \2 \1/' filename

이렇게 썼는데 제대로 안되네요

예:

I 4want5to%change

이 문자열을 다음으로 변경하고 싶습니다.

to 4want5I%change

어떤 아이디어가 있나요?

답변1

[[:alpha:]]대문자와 소문자를 일치시키려면 문자 클래스를 사용 하고 [^[:alpha:]]다른 모든 문자를 일치시키려면 부정을 사용하십시오.

sed -r 's/^([^[:alpha:]]*)([[:alpha:]]+)([^[:alpha:]]+[[:alpha:]]+[^[:alpha:]]+)([[:alpha:]]+)([^[:alpha:]]*)/\1\4\3\2\5/' file.txt

예:

$ sed -r 's/^([^[:alpha:]]*)([[:alpha:]]+)([^[:alpha:]]+[[:alpha:]]+[^[:alpha:]]+)([[:alpha:]]+)([^[:alpha:]]*)/\1\4\3\2\5/' <<<'I 4want5to%change'
to 4want5I%change

$ sed -r 's/^([^[:alpha:]]*)([[:alpha:]]+)([^[:alpha:]]+[[:alpha:]]+[^[:alpha:]]+)([[:alpha:]]+)([^[:alpha:]]*)/\1\4\3\2\5/' <<<'4I 4want5to%change'
4to 4want5I%change

$ sed -r 's/^([^[:alpha:]]*)([[:alpha:]]+)([^[:alpha:]]+[[:alpha:]]+[^[:alpha:]]+)([[:alpha:]]+)([^[:alpha:]]*)/\1\4\3\2\5/' <<<'Spring&summer^winter'
winter&summer^Spring

답변2

공백을 제거하고 역참조를 수정하여 구분 기호를 유지하세요. 또한 구분 기호 " "가 있으므로 <space>4여러 개의 "구분 기호" 문자를 연속으로 구분 기호로 허용해야 합니다.

줄의 시작 부분에 있음을 지정해야 합니다.

그래서 대신:

sed -E 's/([A-Za-z]+) [^A-Za-z] ([A-Za-z]+) [^A-Za-z] ([A-Za-z]+)/\3 \2 \1/' filename

사용:

sed -E 's/^([A-Za-z]+)([^A-Za-z]+[A-Za-z]+[^A-Za-z]+)([A-Za-z]+)/\3\2\1/' filename

답변3

아직 sed를 사용하지 않는다면 Perl을 사용하는 것이 좋습니다. 여기에는 바꾸고 싶은 단어를 지정하는 기능도 포함되어 있습니다.

"파일"에 다음이 포함된 경우

I 4want5to%change
#One two three four
Spring&summer^winter

그러면 이 명령은

$ perl -lnse '
    BEGIN {
        $i = ($first - 1) * 2;
        $j = ($second - 1) * 2;
    }
    @tokens = /([[:alpha:]]*)([^[:alpha:]]*)/g;
    ($tokens[$i], $tokens[$j]) = ($tokens[$j], $tokens[$i]);
    print join "", @tokens;
' -- -first=1 -second=3 file

산출

to 4want5I%change
two#One  three four
winter&summer^Spring

관련 정보