단어에는 문자만 허용되며 다른 문자는 구분 기호입니다. 첫 번째 단어를 세 번째 단어로 바꾸고 싶습니다.
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