이 명령을 실행하려고 합니다.
sed -i -e "s/BASE_64/$BASE_64/" FILE_NAME
$BASE_64
파일 내용의 Base 64 표현은 어디에 있습니까?
sed
문자열이 너무 길어서 오류가 발생했습니다.
매개변수 목록이 너무 깁니다.
이 실수를 어떻게 피할 수 있습니까?
답변1
sed
( 이미 GNU( -i
)를 사용하고 있으므로) 언제든지 이 작업을 수행할 수 있습니다 .
sed -i -f - FILE_NAME << EOF
s/BASE_64/$BASE_64/g
EOF
-f -
sed
sed 스크립트가 stdin에서 읽도록 지시합니다 .
Linux(Linux만 해당 ) 의 여러 파일에 대해 동일한 스크립트를 재사용하려면 다음 사용셸을zsh
과 같은 수행 할 수 있습니다.ksh
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
의미하지 않습니다.표준 입력같은 방법으로 -
. 대신 표준 입력으로 열린 파일에 대한 심볼릭 링크이므로 sed
파일을 열 때마다 처음부터 파일이 다시 열립니다. 위 명령은 다른 시스템( )에서 또는 파이핑을 통해 문서를 구현하는 셸을 사용하여 잘 작동 하지만, /dev/stdin
충분히 적은 수의 conf
파일에 대해 sed
한 번만 호출되는 경우에만 가능합니다. 두 번째 호출 시 with 와 같은 Linux/Cygwin이 아닌 시스템에서는 -f -
첫 /dev/stdin
번째 호출에서 이미 읽었으므로 비어 있는 것으로 나타납니다.
busybox
sed
-i
sed
또한 GNU와 동일한 방식으로 지원 되지만 -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
끝에 있는 합계 항목을 바꿉니다.pat2
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
.