[unix] `sed`에서 문자열의 문자 사이에 하나의 “&”를 어떻게 넣을 수 있습니까?

sed다음과 같은 것을 만들 수 있습니다 :

12345

된다 :

1&2&3&4&5

?



답변

GNU로 sed:

sed 's/./\&&/2g'

( substitute 각 ( g) 문자 ( .(동일한)와 &함께 선행) &( \&)하지만 만 초부터 발생을 ( 2)).

포터블 :

sed 's/./\&&/g;s/&//'

(모든 발생을 교체 &하고 원하지 않는 것을 제거하십시오 ).

일부 awk구현의 경우 (빈 FS에 대해 동작이 지정되지 않아 POSIX가 아님) :

awk -F '' -v OFS="&" '{$1=$1;print}'

( gawk몇 가지 다른 awk구현을 사용 하면 빈 필드 구분 기호는 레코드를 해당 문자 구성 요소로 분할합니다 . 출력 필드 구분 기호 ( OFS)는로 설정됩니다 &. 값을 $1(자체)에 할당 하여 새 필드 구분 기호로 레코드를 강제로 재생성합니다. 인쇄하기 전에 NF=NF작동하며 많은 awk 구현에서 약간 더 효율적이지만 그렇게 할 때의 동작은 현재 POSIX에서 지정되지 않습니다).

perl:

perl -F -lape '$_=join"&",@F'

( -pe모든 줄에 대해 코드를 실행하고 결과 ( $_)를 인쇄하고, -l줄 끝을 자동으로 제거하고 다시 추가 합니다. 여기에 빈 문자열 인에 설정된 구분 기호에 입력 분할로 -a채워집니다 . 결과는 모든 문자를 , 그런 다음 ‘&’로 연결하고 줄을 인쇄하십시오.)@F-F@F

또는

perl -pe 's/(?<=.)./&$&/g'

(다른 문자가 앞에 오는 모든 문자를 대체하십시오 (regexp 연산자 뒤에 보입니까 (? <= …)).

zsh쉘 연산자 사용 :

in=12345
out=${(j:&:)${(s::)in}}

(다시, s::매개 변수 확장 플래그를 사용하여 빈 필드 구분 기호로 분할 하고와 결합 &)

또는:

out=${in///&} out=${out#?}

( 빈 패턴으로 다른 것을 의미 하지만 다른 것을 의미 하지는 않지만) ksh 연산자 를 &사용하여 모든 문자가 발생하기 전에 모든 문자를 대체 하고 POSIX 스트립으로 첫 번째 문자를 제거하십시오. 운영자).${var//pattern/replacement}kshbash${var#pattern}

ksh93쉘 연산자 사용 :

in=12345
out=${in//~(P:.(?=.))/\0&}

( ~(P:perl-like-RE)perl과 같은 정규 표현식을 사용하는 ksh93 glob 연산자 (perl 또는 PCRE와는 다름), (?=.)look-ahead 연산자 : 다른 문자가 뒤에 오는 문자 ( \0) 및 &)

또는:

out=${in//?/&\0}; out=${out#?}

(모든 캐릭터 ( ?)를 &그 자체로 교체하고 ( ) \0슈퍼 플로우 스를 제거합니다)

bash쉘 연산자 사용 :

shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}

(같은 zsh당신이 필요로하는 것을 제외하고,의 @()가 (당신이 필요로하는 ksh에서의 글로브 운영자 extglobbash)).


답변

유닉스 유틸리티 :

fold -w1|paste -sd\& -

설명 :

"fold -w1" -각 입력 문자를 자체 줄로 줄 바꿈합니다.

접기-지정된 너비에 맞게 각 입력 줄을 줄 바꿈

-w, –width = WIDTH는 80 대신 WIDTH 열을 사용합니다.

%echo 12345|fold -w1
1
2
3
4
5

"paste -sd\& -"&구분자로 사용하여 입력 행을 병합합니다.

붙여 넣기-파일 라인 병합

-s, –serial 대신 한 번에 한 파일 씩 붙여 넣기

-d, –delimiters = LIST는 TAB 대신 LIST의 문자를 재사용합니다.

%fold -w1|paste -sd\& -
1&2&3&4&5

(입력에 여러 줄이 포함되어 있으면이 줄과 결합됩니다. &)


답변

사용하다 sed

sed 's/./&\&/g;s/.$//'


답변

sed 's/\B/\&/g'

\ B- 단어 경계를 제외한 모든 곳에서 일치합니다. 즉, 왼쪽의 문자와 오른쪽의 문자가 모두 “단어”문자이거나 “단어 이외”문자 인 경우 일치합니다.

정보 : GNU sed 매뉴얼, 정규 표현식 확장 .

테스트 :

sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5


답변

이것은 다른 답변보다 약간 느리지 만 매우 분명합니다.

echo 12345 | perl -lnE 'say join "&", split //'


답변

다른 방법이 있습니다. sed 표현식의 첫 번째 부분은 모든 문자를 캡처 한 다음 문자 및 앰퍼샌드로 바꿉니다. 두 번째 부분은 라인의 끝에서 앰퍼샌드를 제거합니다.

echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5

멀티 바이트 문자에서도 작동합니다.


답변