[linux] 파일이없는 경우에만 파일에 행 추가

구성 파일의 끝에 다음 줄을 추가해야합니다.

include "/configs/projectname.conf"

라는 파일에 lighttpd.conf

나는 sed이것을하기 위해 사용 하려고 노력하고 있지만 어떻게 해결할 수는 없다.

줄이 아직 없으면 어떻게 삽입합니까?



답변

간단하게 유지하십시오 🙂

grep + echo로 충분합니다 :

grep -qxF 'include "/configs/projectname.conf"' foo.bar || echo 'include "/configs/projectname.conf"' >> foo.bar

편집 : 통합 @cerin 및 @ thijs-wouters 제안 .


답변

이것은 사용하여 깨끗하고 읽기 쉽고 재사용 가능한 솔루션을 것 grep하고 echo이미 존재하지 않는 경우에만 파일에 줄을 추가 :

LINE='include "/configs/projectname.conf"'
FILE='lighttpd.conf'
grep -qF -- "$LINE" "$FILE" || echo "$LINE" >> "$FILE"

전체 라인 사용과 일치해야하는 경우 grep -xqF

-s파일이 존재하지 않을 때 오류를 무시하고 해당 줄만있는 새 파일을 작성하려면 추가하십시오 .


답변

sed버전은 다음과 같습니다 .

sed -e '\|include "/configs/projectname.conf"|h; ${x;s/incl//;{g;t};a\' -e 'include "/configs/projectname.conf"' -e '}' file

문자열이 변수에있는 경우 :

string='include "/configs/projectname.conf"'
sed -e "\|$string|h; \${x;s|$string||;{g;t};a\\" -e "$string" -e "}" file


답변

보호 된 파일에 쓰는 경우 @drAlberT 및 @ rubo77의 답변은 sudo 할 수 없으므로 작동하지 않을 수 있습니다 >>. 유사 간단한 해결책은 , 다음, 사용하는 것입니다 tee --append(맥 OS에, 또는 tee -a) :

LINE='include "/configs/projectname.conf"'
FILE=lighttpd.conf
grep -qF "$LINE" "$FILE"  || echo "$LINE" | sudo tee --append "$FILE"


답변

언젠가 다른 사람 이이 코드를 “레거시 코드”로 처리 해야하는 경우 다음과 같이 덜 이질적인 코드를 작성하면 그 사람에게 감사하게 될 것입니다.

grep -q -F 'include "/configs/projectname.conf"' lighttpd.conf
if [ $? -ne 0 ]; then
  echo 'include "/configs/projectname.conf"' >> lighttpd.conf
fi


답변

또 다른 sed 솔루션은 항상 마지막 줄에 추가하고 기존의 것을 삭제하는 것입니다.

sed -e '$a\' -e '<your-entry>' -e "/<your-entry-properly-escaped>/d"

“적절하게 이스케이프 처리됨”은 항목과 일치하는 정규식을 배치하는 것, 즉 실제 항목에서 모든 정규식 컨트롤을 이스케이프 처리하는 것, 즉 ^ $ / *? + () 앞에 백 슬래시를 두는 것을 의미합니다.

이것은 파일의 마지막 줄에서 실패하거나 줄 바꿈이 없으면 확실하지 않지만 일부 멋진 분기로 처리 할 수 ​​있습니다.


답변

awk를 사용하십시오

awk 'FNR==NR && /configs.*projectname\.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} ' file file