범용 쉘 인터프리터를 사용하여 \n이 포함된 큰 텍스트가 포함된 변수를 파일에 씁니다. 어떻게 하나요?

범용 쉘 인터프리터를 사용하여 \n이 포함된 큰 텍스트가 포함된 변수를 파일에 씁니다. 어떻게 하나요?

환경: Linux 쉘 이상, busybox의 ash 쉘(예: 시스템: Openwrt).

문자열 변수가 주어지면텍스트 "${a}"는 다음과 같이 구성됩니다.

for index in $(seq 1 40000); do #it is 40000 for a reason, it helps if you want to reproduce the error on your system.
   a="${a}""\n""word ${index}"
done

이 변수를 일반 명령에 대한 인수로 사용하려고 하면 오류가 발생한다는 점을 고려하세요. 예를 들면 다음과 같습니다.

echo "${a}" #fails
awk -v VAR_A="${a}" '<program>' #fails

(실패 이유는 다음과 같습니다.http://www.in-ulm.de/~mascheck/various/argmax/)

sed/awk/perl/기타 강력한 인터프리터 대신 간단한 명령을 사용하여 이러한 변수를 텍스트 파일에 쓰는 방법.

이상적으로 텍스트 파일은 다음과 같아야 합니다.

word 1
word 2
word 3
...

다음과 같은 대신:

word 1\nword 2\nword 3\n...

업데이트 1:누군가 "변수를 생성하는 스크립트를 왜 변경할 수 없나요 $a?"라고 물었습니다. 왜냐하면 권한이 부족해서 할 수 없기 때문입니다("이 스크립트는 현재까지 작동하므로 인쇄 부분만 수정하면 됩니다."). 따라서 $a해당 형식은 이미 제공되었으며 파일로 인쇄하는 방법만 찾을 수 있습니다.

업데이트 2:제안된 "여기 문서"를 사용하면 대부분의 문제가 해결되었지만 내용은 여전히 ​​한 줄에 인쇄됩니다. 어쩌면 내 구성일까요?

답변1

너 하나 만들 수 있어여기 문서그리고 사용 cat:

$ cat <<EOT >output
$a
EOT
$ wc -l output
40000

귀하의 Busybox가 얼마나 강력한지는 정확히 모르지만 ash(구성 가능) 내장된 프로그램이 전혀 없더라도 어디에서나 작동해야 합니다. cat값 자체를 명령줄에 입력하는 대신 변수 값을 준파일로 확장한 다음 할당합니다 .


"\n"문자열에서 리터럴을 제거 하려는 것 같으므로 매개변수 대체 중에 문자열 대체를 사용할 수도 있습니다. 이것할 수 있는이 (비 POSIX) 확장이 있는 경우 다음을 사용할 ash수 있습니다 .sed${var//\\\n/$NEWLINE}

$ busybox ash
$ foo="x\ny\nz"
$ echo "$foo"
x\ny\nz
$ NEWLINE="
"
$ echo "${foo//\\\n/$NEWLINE}"
x
y
z

이는 동일한 구문입니다.배쉬로; 로 시작하는 ${var/pattern/replacement}경우 pattern전역 위치는 어디입니까 /? ash많은 것을 구성한 것 같으 므로 존재하지 않을 수도 있습니다. 이 경우 and 를 사용해야 할 수도 있지만 , and 를 현명하게 사용하면 이 문제를 해결하고 올바른 문자열을 재구성할 수 있다고 sed생각합니다 .IFSread

답변2

busybox seq -s'
word ' 4000 | 
sed '/000/w /dev/fd/2' |  
wc -l

산출

word 1000
word 2000
word 3000
word 4000
4000

busybox내장 함수를 사용 seq하고 구분 기호를 지정할 수 있어야 합니다 word. 원하는 경우 >redirect해당 내용을 파일로 저장할 수 있습니다. 위의 예에서는 sed출력을 이해하기 위해 4000줄을 볼 필요가 없도록 여러 부분 으로 나누었 지만 모두 인쇄되었습니다. 이것을 지지하지 않는다면 busybox,업그레이드.

따라서 기본적으로 해야 할 일은 다음 $a과 같습니다.

busybox seq -s'
word ' $MAX_INCREMENT >$TO_FILE

관련 정보