전화번호가 있습니다 -> 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