sed 명령을 사용하여 긴 문자열 바꾸기: 매개변수 목록이 너무 김 오류

sed 명령을 사용하여 긴 문자열 바꾸기: 매개변수 목록이 너무 김 오류

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

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 -sedsed 스크립트가 stdin에서 읽도록 지시합니다 .

Linux(Linux만 해당 ) 의 여러 파일에 대해 동일한 스크립트를 재사용하려면 다음 사용셸을zsh과 같은 수행 할 수 있습니다.kshbashdashyashbashsed

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-ised또한 GNU와 동일한 방식으로 지원 되지만 -f -. -f /dev/stdinFreeBSD의 경우 다음을 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_64설정할 필요 없이 ed 명령 파일을 생성하면 됩니다.

에드가 설명하다

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

물론 sed명령을 파일에 넣어서 사용할 수도 있지만 그렇게 해서 파일을 그 자리에서 수정하고 싶다면 임시 파일을 만들어서 옮기는 것보다 -f사용하는 것이 더 좋습니다 .edsed -i

답변4

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

SEDCOMMANDS=`tempfile`

그리고 전화해

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

안쓰셔도 괜찮습니다 sed -i. 파일을 그 자리에서 편집하려면 다음을 따르십시오.https://unix.stackexchange.com/a/284188/149867해당 ed명령을 파일에 넣은 다음 w및 를 입력합니다 q.

관련 정보