이 명령을 실행하려고 합니다.
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 -
sed
stdin에서 sed 스크립트를 읽으라고 지시합니다 .
여러 파일에 대해 동일한 스크립트를 재사용하려는 경우 Linux(Linux에만 해당)와 같은 쉘을 사용하고 zsh
여기 에서 임시 파일이 있는 문서를 구현하는 최대 버전 5.0을 사용합니다 (또는 5.1+ 와 같은 파이프와 반대) ksh
. 상대적으로 작은 heredocs이고 여전히 GNU를 사용하면 다음 을 수행할 수 있습니다.bash
dash
yash
bash
sed
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이 아닌 시스템에서는 첫 번째 호출에서 이미 읽었으므로 비어 있는 것으로 나타납니다.conf
sed
-f -
/dev/stdin
busybox
sed
도 -i
GNU와 동일한 방식으로 지원 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
검색하여 해당 줄 뒤에 내용을 삽입하고 첫 번째 줄로 돌아가서 문자열이 포함된 줄을 다시 검색하여 삭제하는 데 사용됩니다 . 의 명령은 수정 된 파일을 저장합니다.FILENAME
BASE64
base64.txt
BASE64
w
ed
답변3
또 다른 옵션은 명령을 파일로 바꾸고 저장하는 sed
것 입니다 . 예를 들어 다음 내용으로 ed
생성하는 경우 :ed_cmds
%s/BASE_64/<expanded variable>/g
w
q
그런 다음 실행할 수 있습니다
< ed_cmds ed FILE_NAME
그러면 원하는 대로 변경되므로 설정하는 대신 $BASE_64
ed 명령 파일을 만듭니다.
에드 설명
%
파일의 각 줄에 명령을 적용하는 것을 의미합니다.s/pat1/pat2/g
pat1
withpat2
및g
끝에 있는 대체 발생은 첫 번째 일치뿐만 아니라 라인의 모든 일치에 대해 수행됩니다.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
지침을 파일에 넣은 다음 w
및 q
.