각 문자 뒤에 특정 문자를 추가하는 방법은 무엇입니까?

각 문자 뒤에 특정 문자를 추가하는 방법은 무엇입니까?

전화번호가 있습니다 -> 12345

다음 형식으로 출력하고 싶습니다.

1+2+3+4+5

echo `cat fl.txt | paste -s -d ''`

.12345

그러나 아래 명령에 +를 추가하면 동일한 12345.

echo `cat fl.txt | paste -s -d '' | tr -s '' '+'`

답변1

GNU sed를 사용하면 다음 작업도 수행할 수 있습니다.

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

답변2

문자열을 문자로 분할하는 것이 더 쉽습니다.

fold -w1 file | paste -sd+ -

일부 명령 버전에는 fold이 옵션이 없지만 -c이 옵션이 있습니다 -w. 이 경우에는 서로 바꿔 사용할 수 있습니다.
또는:

grep -o '.' file | paste -sd+ -

어쩌면 다음 명령을 사용할 수도 있습니다.

awk -v OFS='+' -F '' '{$1=$1; print}' file

그리고:

sed 's/\B/+/g' file

답변3

그리고 zsh:

$ number=12345
$ printf '%s\n' ${(j[+])${(s[])number}}
1+2+3+4+5

s[]매개변수 확장 플래그는 $number문자 구성요소로 분할됩니다. j[+]그들과 함께 돌아오세요 +.

그리고 bash:

$ number=12345
$ shopt -s extglob
$ tmp=${number//@()/+}
$ printf '%s\n' "${tmp#+}"
1+2+3+4+5

${number//@()/+}다음 항목을 모두 바꿉니다.아무것도 없다그리고 +. 어떤 이유로 ${number///+}작동하지 않는 것 같습니다 bash(그러나 작동합니다 zsh).

답변4

awk나 sed 대신 perl을 사용하는 다른 가능성도 있습니다.

echo 12345 | perl -lpe '$_ = join "+", split //;'

또는 (번호가 에 저장된 경우 fl.txt)

# echo 12345 > fl.txt
perl -lpe '$_ = join "+", split //;' fl.txt

매개변수는 -l단순히 줄 끝("+"로 연결된 경우)을 포함하지 않습니다. 그렇지 않으면 이런 결과를 얻게 됩니다 1+2+3+4+5+.

또는 이미 언급한 sed 방법과 유사한 이 방법을 사용할 수 있습니다.

perl -pe 's/.\K/+/g; s/\+$//;' fl.txt

또는

perl -pe 's/.\K(?!$)/+/g;' fl.txt

또는

perl -pe 's/\B/+/g;' fl.txt

모든 경우의 출력:

1+2+3+4+5

관련 정보