sed
다음과 같은 것을 만들 수 있습니다 :
12345
된다 :
1&2&3&4&5
?
답변
GNU로 sed
:
sed 's/./\&&/2g'
( s
ubstitute 각 ( 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}
ksh
bash
${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에서의 글로브 운영자 extglob
에 bash
)).
답변
유닉스 유틸리티 :
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
멀티 바이트 문자에서도 작동합니다.