긴 문자열을 sed 명령으로 바꾸십시오: 인수 목록이 너무 깁니다. 오류

긴 문자열을 sed 명령으로 바꾸십시오: 인수 목록이 너무 깁니다. 오류

이 명령을 실행하려고 합니다.

sed -i -e "s/BASE_64/$BASE_64/" FILE_NAME

어디에 $BASE_64파일 내용의 기본 64 표현이 있습니다.

sed문자열이 너무 길어서 오류가 발생합니다.

인수 목록이 너무 깁니다.

이 오류를 방지하는 것이 어떻게 가능합니까?

답변1

언제든지 다음을 수행할 수 있습니다(이미 GNU를 사용하고 있으므로 sed( -i)).

sed -i -f - FILE_NAME << EOF
s/BASE_64/$BASE_64/g
EOF

-f -sedstdin에서 sed 스크립트를 읽으라고 지시합니다 .

여러 파일에 대해 동일한 스크립트를 재사용하려는 경우 Linux(Linux에만 해당)와 같은 쉘을 사용하고 zsh여기 에서 임시 파일이 있는 문서를 구현하는 최대 버전 5.0을 사용합니다 (또는 5.1+ 와 같은 파이프와 반대) ksh. 상대적으로 작은 heredocs이고 여전히 GNU를 사용하면 다음 을 수행할 수 있습니다.bashdashyashbashsed

find . -name '*.conf' -exec sed -i -f /dev/stdin {} + << EOF
s/BASE_64/$BASE_64/g
EOF

Linux(및 Linux 및 Cygwin에만 해당)에서는 다음을 /dev/stdin의미하지 않습니다.표준입력같은 방식으로 -합니다. 대신 stdin에서 열린 파일에 대한 심볼릭 링크이므로 sed파일을 열 때마다 처음부터 새로 파일이 열립니다. 위 명령은 다른 시스템(이 있는)이나 파이프를 사용하여 여기 문서를 구현하는 셸에서 제대로 작동 하지만 한 번만 호출되는 파일이 /dev/stdin충분히 적은 경우에만 가능합니다 . 두 번째 호출 시 with 와 같이 Linux/Cygwin이 아닌 시스템에서는 첫 번째 호출에서 이미 읽었으므로 비어 있는 것으로 나타납니다.confsed-f -/dev/stdin

busybox sed-iGNU와 동일한 방식으로 지원 sed하지만 -f -. 그래서 당신은 -f /dev/stdin어떤 경우에도 그곳을 사용하고 싶을 것입니다 . FreeBSD에서는 sed다음을 사용합니다:

sed -i '' -f /dev/stdin FILE_NAME << EOF
s/BASE_64/$BASE_64/g
EOF

답변2

먼저, base64로 인코딩된 데이터를 base64.txt.

예를 들어:

base64 < originalfile > base64.txt

그 다음에:

printf '%s\n' '/BASE64/r base64.txt' 1 '/BASE64/d' w | ed FILENAME

문자열이 포함된 줄을 ed검색하여 해당 줄 뒤에 내용을 삽입하고 첫 번째 줄로 돌아가서 문자열이 포함된 줄을 다시 검색하여 삭제하는 데 사용됩니다 . 의 명령은 수정 된 파일을 저장합니다.FILENAMEBASE64base64.txtBASE64wed

답변3

또 다른 옵션은 명령을 파일로 바꾸고 저장하는 sed것 입니다 . 예를 들어 다음 내용으로 ed생성하는 경우 :ed_cmds

%s/BASE_64/<expanded variable>/g
w
q

그런 다음 실행할 수 있습니다

< ed_cmds ed FILE_NAME

그러면 원하는 대로 변경되므로 설정하는 대신 $BASE_64ed 명령 파일을 만듭니다.

에드 설명

  • %파일의 각 줄에 명령을 적용하는 것을 의미합니다.
  • s/pat1/pat2/gpat1with pat2g끝에 있는 대체 발생은 첫 번째 일치뿐만 아니라 라인의 모든 일치에 대해 수행됩니다.
  • w변경 사항을 디스크에 기록
  • q종료(어차피 EOF를 받으면 발생함)

물론 sed명령을 파일에 넣고 사용할 수도 -f있지만, 그렇게 하고 파일을 수정하려는 경우에는 ed임시 파일을 만들고 그대로 이동하는 대신 사용하는 것이 좋습니다 sed -i.

답변4

결국 sed지침을 파일에 넣었습니다.

SEDCOMMANDS=`tempfile`

그리고 전화했다

sed -f "$SEDCOMMANDS" -- "$FILE_NAME"

을 사용하지 않으면 좋습니다 sed -i. 파일을 그 자리에서 편집하려면 다음을 따르십시오.https://unix.stackexchange.com/a/284188/149867해당 ed지침을 파일에 넣은 다음 wq.

관련 정보