비어 있지 않은 마지막 줄을 명령 출력으로 바꾸기

비어 있지 않은 마지막 줄을 명령 출력으로 바꾸기

.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=이전 줄( )을 방금 삽입한 줄과 연결합니다(귀하의 질문에 있으므로 한 줄로 가정합니다).

관련 정보