파일이없는 경우에만 파일에 행 추가
구성 파일의 끝에 다음 줄을 추가해야합니다.
include "/configs/projectname.conf"
라는 파일에 lighttpd.conf
나는 sed
이것을하기 위해 사용 하려고 노력하고 있지만 어떻게 해결할 수는 없다.
줄이 아직 없으면 어떻게 삽입합니까?
간단하게 유지하십시오 :)
grep + echo로 충분합니다 :
grep -qxF 'include "/configs/projectname.conf"' foo.bar || echo 'include "/configs/projectname.conf"' >> foo.bar
-q
조용히 해-x
전체 라인과 일치-F
패턴은 일반 문자열입니다- https://linux.die.net/man/1/grep
편집 : 통합 @cerin 및 @ thijs-wouters 제안 .
이것은 사용하여 깨끗하고 읽기 쉽고 재사용 가능한 솔루션을 것 grep
하고 echo
이미 존재하지 않는 경우에만 파일에 줄을 추가 :
LINE='include "/configs/projectname.conf"'
FILE='lighttpd.conf'
grep -qF -- "$LINE" "$FILE" || echo "$LINE" >> "$FILE"
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
:
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
grep을 사용한 답변이 잘못되었습니다. 전체 행을 일치 시키려면 -x 옵션을 추가해야합니다. 그렇지 않으면 #text to add
정확하게 추가 할 때 와 같은 행 이 여전히 일치합니다 text to add
.
올바른 해결책은 다음과 같습니다.
grep -qxF 'include "/configs/projectname.conf"' foo.bar || echo 'include "/configs/projectname.conf"' >> foo.bar
sed 사용 : 줄 끝에 삽입합니다. 물론 평소대로 변수를 전달할 수도 있습니다.
grep -qxF "port=9033" $light.conf
if [ $? -ne 0 ]; then
sed -i "$ a port=9033" $light.conf
else
echo "port=9033 already added"
fi
oneliner sed 사용
grep -qxF "port=9033" $lightconf || sed -i "$ a port=9033" $lightconf
echo를 사용하면 루트에서는 작동하지 않지만 다음과 같이 작동합니다. 그러나 암호를 요구할 수 있으므로 원하는 경우 자동으로 처리 할 수 없습니다.
특정 사용자의 루트에서 편집하려고 할 때 문제가 발생했습니다. $username
이전을 추가하는 것이 나를 위해 수정되었습니다.
grep -qxF "port=9033" light.conf
if [ $? -ne 0 ]; then
sudo -u $user_name echo "port=9033" >> light.conf
else
echo "already there"
fi
필요한 쓰기 권한이 제한된 파일을 편집해야했습니다 sudo
. ghostdog74의 답변에서 작업하고 임시 파일을 사용하십시오.
awk 'FNR==NR && /configs.*projectname\.conf/{f=1;next}f==0;END{ if(!f) { print "your line"}} ' file > /tmp/file
sudo mv /tmp/file file
'Programing' 카테고리의 다른 글
정규 표현식 : 첫 번째 공백까지 모든 단어와 일치 (0) | 2020.07.04 |
---|---|
리플렉션을 사용하여 Java에서 일반 매개 변수 유형 가져 오기 (0) | 2020.07.04 |
깊이 중첩 된 스택을 떠날 때 프래그먼트 백 스택을 정리하는 올바른 방법입니까? (0) | 2020.07.04 |
Arduino 스케치 업로드 문제-avrdude : stk500_recv () : 프로그래머가 응답하지 않습니다 (0) | 2020.07.04 |
jQuery로 파일 입력 크기를 확인하는 방법은 무엇입니까? (0) | 2020.07.04 |