`sed`에서 문자열의 문자 사이에 "&"를 어떻게 배치합니까?

`sed`에서 문자열의 문자 사이에 "&"를 어떻게 배치합니까?

sed다음과 같이 할 수 있습니다 :

12345

다음과 같이 됩니다:

1&2&3&4&5

?

답변1

GNU 사용 sed:

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

(s대안( ) 앞에 동일한 ( 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' 

(앞의 모든 문자를 다른 문자로 바꿉니다(뒤돌아보기 정규식 연산자(?<=...))

zsh쉘 연산자를 사용하십시오 :

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

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

또는:

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

&(ksh 연산자를 사용하여 (각 문자 앞의) 모든 항목을 대체하고 ${var//pattern/replacement}( kshnull 패턴에 다른 것이 있다는 것은 다른 것을 의미하지만 무엇이 있는지 잘 모르겠습니다) POSIX 스트리핑을 사용하여 bash첫 번째 연산자를 제거합니다 ${var#pattern}.

ksh93쉘 연산자를 사용하십시오 :

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

( ~(P:perl-like-RE)perl과 유사한 정규 표현식을 사용하기 위한 ksh93 glob 연산자(perl 또는 PCRE와는 다름), (?=.)예측 연산자: 뒤에 다른 문자 자체가 오면 문자를 대체합니다( \0) 및 &)

또는:

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

?(각 문자( )를 &자체 문자( )로 바꾼 \0다음 추가 문자를 삭제합니다.)

bash쉘 연산자를 사용하십시오 :

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

( 와 동일 zsh하지만 거기에 있어야 합니다( @()에서 ksh glob 연산자를 사용해야 함).extglobbash

답변2

유닉스 유틸리티:

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 탭 대신 LIST의 문자를 재사용합니다.

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

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

답변3

사용sed

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

답변4

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

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

관련 정보