두 단어의 첫 글자를 바꾸는 방법은 무엇입니까?

두 단어의 첫 글자를 바꾸는 방법은 무엇입니까?
$ echo 'foo bar' | sed SOMEMAGIC
boo far
$ echo 'one two' | sed SOMEMAGIC
tne owo

묻다:일반적으로 "bar"의 "b"를 "foo"의 "f"로 어떻게 바꾸나요? 그 반대로, "foo"의 "f"를 "bar"의 "b"로 바꿉니다.

답변1

캡처 그룹을 사용해야 합니다. (1) 단어의 첫 글자, (2) 두 번째 단어의 첫 글자까지의 모든 내용, (3) 두 번째 단어의 첫 글자를 캡처한 다음 (3)과 (1)을 바꿉니다.

아래 예에서는 줄이 공백이 아닌 문자로 시작한다고 가정합니다.

당신은 말할 수 있습니다 :

sed 's/\(.\)\([^ ]* \)\(.\)/\3\2\1/'

또는

sed -r 's/(.)([^ ]* )(.)/\3\2\1/'

예를 들어,

$ echo 'foo bar' | sed -r 's/(.)([^ ]* )(.)/\3\2\1/'
boo far
$ echo 'one two' | sed -r 's/(.)([^ ]* )(.)/\3\2\1/'
tne owo

다음은 줄 시작 부분의 공백이나 두 단어 사이의 여러 공백과 같은 상황도 처리할 수 있습니다.

sed -r 's/([^ ])([^ ]* +)(.)/\3\2\1/'

해당 Perl 표현식은 다음과 같습니다.

perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'

예:

$ echo 'one two' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
tne owo
$ echo 'one two' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
tne owo
$ echo 'foo bar' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
boo far
$ echo '   one     two' | perl -pe 's/(\S)(\S+\s+)(\S)/$3$2$1/'
   tne     owo

답변2

one=word ; two=phrase ; three=$one
one="${two%"${two#?}"}${one#?}"  
two="${three%"${three#?}"}${two#?}"
echo "$one $two"
> pord whrase

답변3

가능한 해결책 awk:

echo 'foo bar' | awk '{x=substr($1,1,1); y=substr($2,1,1); sub(x, y, $1); sub(y, x, $2); print $0}'
boo far

이 두 substr함수 호출은 각 레코드에서 첫 번째 문자를 추출하고 sub함수에 대한 두 호출은 이러한 문자의 첫 번째 발생을 서로 대체합니다.

답변4

sed를 사용하세요:

echo 'one two' |sed -re 's/([^ ])([^ ]+)( +)([^ ])([^ ]+)/\4\2\3\1\5/'
tne owo

가변 공간과도 일치합니다.

관련 정보