.env
이런 파일이 있어요
PARAM1=val
PARAM2=val
공백이 없는 마지막 줄을 다른 파일 내용으로 바꾸고 싶습니다.
지금까지 나는 다음을 가지고 있습니다 :
{ (sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' local.env | sed '$d' local.env && printf "CONFIG=%s" "$(cat config.json | jq -c .)") >local.env.mod; } && mv local.env.mod local.env
이 작업을 수행하는 더 좋고/쉬운 방법이 있습니까?
답변1
파일을 되돌리고 교체할 수 있습니다.첫 번째공백이 아닌 줄
printf -v new_line 'CONFIG=%s' "$(jq -c . config.json)"
tac local.env \
| awk -v line="$new_line" '
!n && /[^[:blank:]]/ {print line; n = 1; next}
{print}
' \
| tac > local.env.mod && mv local.env.mod local.env
답변2
나는 전혀 모른다더 나은 것PARAM2
( 교체해야 할 설정 라인이라는 것을 알면 더 좋겠지만 구체적으로 "비어 있지 않은 마지막 라인"이라고 말씀하셨습니다.) 하지만 ed
편집자는 지나치게 복잡한 텍스트 파일에 편집 프로세스를 적용하는 데 매우 능숙합니다 sed
( 그러나 sed
이는 )와는 달리 전체 텍스트 Read into memory를 대체한다는 점에 유의하세요 .
$ cat new-content
this is the new content
$ printf '%s\n' '?.? d' '-r new-content' ,p Q | ed -s file
PARAM1=val
this is the new content
결과 편집 스크립트 ed
는 다음과 같습니다.
?.? d
-r new-content
,p
Q
먼저 무엇이든 포함된 첫 번째 줄을 뒤로 검색한 다음(여기에서는 공백이 표시되지 않더라도 계산됩니다. .
이는 [[:graph:]]
보이는 문자에만 관심을 갖도록 변경됩니다) 제거합니다.
줄을 삭제하면 커서가 다음 줄로 이동하므로 -
앞의 r
내용은 커서가 있는 줄 위에 줄의 내용을 삽입(읽기)하라는 의미입니다 ed
.new-contens
마지막으로 표준 출력에 전체 문서를 표시하고 무조건 편집기를 종료합니다 ,p
. Q
"인라인 편집"을 수행하려면 이 두 명령을 wq
수정된 문서를 파일에 다시 쓰고 종료하는 단일 명령으로 변경하십시오.
in 뒤에 파일 내용을 삽입하려면 new-content
파일 끝을 공백이 아닌 마지막 줄부터 시작하여 바꿉니다.=
CONFIG=
$ printf '%s\n' '?[[:graph:]]?,$ c' 'CONFIG=' . 'r new-content' '-,.j' ,p Q | ed -s file
PARAM1=val
CONFIG=this is the new content
이 c
명령은 줄을 변경합니다. 공백이 아닌 마지막 줄부터 끝까지 줄을 바꾸는 데 사용합니다. 명령 입력은 c
점으로 끝나고 new-content
그 뒤에 의 내용이 삽입됩니다 r
. 이 j
명령은 CONFIG=
이전 줄( )을 방금 삽입한 줄과 연결합니다(귀하의 질문에 있으므로 한 줄로 가정합니다).