내용이 문자 a와 b로 구성된 "ab"라는 텍스트가 있습니다. ed에서 s 명령을 사용하여 a를 b로, b를 a로 즉시 변경하고 싶습니다. 하지만 단계별로 변경하면 아시다시피 모든 텍스트는 a 또는 b로만 됩니다. a를 b로, b를 a로 동시에 바꾸는 방법이 있나요?
답변1
y
네이티브는 아닙니다. tr///
sed() 및 Perl(일명)에서 볼 수 있는 음역 명령이 부족합니다 y///
. 하지만 ansliterate 명령 자체를 사용하여 가짜로 만들 수 있습니다 tr
.
ed -s input <<< $'e !tr ab ba < %\nw\nq'
이 e
명령은 파일의 내용을 쉘 escape 명령의 결과로 대체합니다. 이 명령은 a를 b로, b를 a로 음역하고 현재 파일 이름을 입력으로 제공합니다. 그런 다음 새 파일이 w
디스크에 기록 되고 q
편집됩니다.
답변2
C
당신이 하는 일은 or 에서 두 변수를 바꾸는 것과 같습니다 BASIC
: tmp = a; a = b; b = tmp
;-)
예:
p
foobar
s/foo/FOO/
s/bar/foo/
s/FOO/bar/
p
barfoo
위의 내용을 FOO
줄에 없는 문자나 텍스트로 바꾸세요.
답변3
"동시에 모두"는 아니지만 일련의 단계를 거쳐 수행할 수 있습니다.
첫 번째 단계는 변경해야 할 모든 항목을 표시하는 것입니다.
두 번째 단계는 모든 태그 a
를 b
.
세 번째 단계는 모든 태그 b
를 a
.
그래서 질문은 다음과 같습니다how can I tag the things to change?
a
토큰화에 문자(교환하려는 두 문자 중 하나)를 사용할 수 있다는 흥미로운 기술이 있습니다 .
s/[ab]/a&/g
s/aa/b/g
s/ab/a/g
이 입력의 경우
aaaa aaab aaba aabb abaa abab abba abbb baaa baab baba babb bbaa bbab bbba bbbb
이러한 단계는
aaaaaaaa aaaaaaab aaaaabaa aaaaabab aaabaaaa aaabaaab aaababaa aaababab abaaaaaa abaaaaab abaaabaa abaaabab ababaaaa ababaaab abababaa abababab
bbbb bbbab bbabb bbabab babbb babbab bababb bababab abbbb abbbab abbabb abbabab ababbb ababbab abababb abababab
bbbb bbba bbab bbaa babb baba baab baaa abbb abba abab abaa aabb aaba aaab aaaa
이것이 원하는 결과입니다.
분명히 특정 문자가 입력에 없다는 것을 알고 있는 경우(예: Ctrl-A) 이를 3단계로 변경할 수도 있습니다. 먼저 모두를 로 변경한 a
다음 ctrl-A
모두 b
를 로 변경한 다음 모두 를 로 a
변경합니다 .ctrl-a
b