$ 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
가변 공간과도 일치합니다.