seq가 완료될 때 개행 문자 인쇄를 방지하는 방법은 무엇입니까?

seq가 완료될 때 개행 문자 인쇄를 방지하는 방법은 무엇입니까?

다음과 같이 열 머리글을 생성하려면:

1234567890123456789

저는 seq와 echo를 사용하려고 합니다.

seq -s '' 1 9 ; echo -n 0; seq -s '' 1 9

그러나 seq는 각 실행 후에 개행 문자를 출력합니다. 이것을 어떻게 피할 수 있습니까?

답변1

단지 print 를 원한다고 가정하면 1234567890123456789다음과 같이 할 수 있습니다:

$ printf "%s" $(seq 1 9) $(seq 0 9)
1234567890123456789$

하지만 후행 줄 바꿈이 전혀 없으므로 다음을 선호할 수도 있습니다.

$ printf "%s" $(seq 1 9) $(seq 0 9) $'\n'
1234567890123456789
$

그렇지 않은 경우 더 쉬운 옵션이 있습니다.필요사용 seq:

$ perl -le 'print 1..9,0,1..9'
1234567890123456789
$ printf "%s" {1..9} {0..9} $'\n'
1234567890123456789

이식성을 언급했으므로 해당 perl방법을 사용하는 것이 좋습니다. 또는 이식성이 없는 시스템에 실행될 수 있지만 perl셸에서 bash등을 포함하여 동일한 명령을 실행해야 하는 경우에는 sh시도해 보세요.dashtcsh카밀의 방법.

답변2

를 사용하여 모든 스트림에서 줄바꿈을 제거할 수 있습니다 tr -d '\n'. 당신의 경우에는

(seq -s '' 1 9 ; echo -n 0; seq -s '' 1 9) | tr -d '\n'

다른 답변은 원래 접근 방식을 수정하는 데 중점을 둘 수 있지만 이 접근 방식은 이전 내용에 관계없이 개행 문자만 제거해야 합니다 |.

답변3

나는 당신이 특정 문자열을 원하지 않고 가변 길이로 숫자가 증가하는 문자열을 원한다고 가정합니다. 이를 위해서는 여러 번의 호출을 통해 너비를 구축하는 것보다 숫자를 변경하여 너비를 변경할 수 있는 것이 유용할 수 있습니다 seq.

Bash에서는 다음과 같은 것을 사용할 수 있습니다(19개의 긴 시퀀스에 대해):

for ((i=1; i <= 19; i++)); do printf "%d" "$(( i % 10 ))"; done; echo

이는 표준 셸(적어도 대시 및 비지박스)에서 작동합니다.

i=1; while [ "$i" -le 19 ]; do printf "%d" "$(( i % 10 ))"; i=$((i+1)); done; echo

답변4

그것을 사용할 때tr후행 개행 문자를 제거하려면 다음을 제거한다는 점을 인식하는 것이 좋습니다.모두-d옵션에 지정된 문자의 발생 횟수입니다. 따라서 더 얇게 만들 수 있습니다.

(seq 1 9; echo 0; seq 1 9) | tr -d '\n'

echo더 이상 필요하지 않습니다 -n.

완전성을 위해 BSD 버전의 seqwhen -s ''사양은 종료 시 개행 문자를 생성하지 않습니다.

관련 정보