sed를 사용하여 구성 파일에 새 줄을 일치시키고 추가하면 중복 줄이 생성됩니다.

sed를 사용하여 구성 파일에 새 줄을 일치시키고 추가하면 중복 줄이 생성됩니다.

CONFIG_BLUE와 일치하는 sed 쿼리를 작성한 다음 그 아래에 CONFIG_GREEN을 추가하려고 합니다. 내가 만든 쿼리는 작동하지만 결과는 동일한 행이 두 번 반복됩니다.

sed 쿼리;

sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test.txt

예;

CONFIG_BLUE=y
CONFIG_GREEN=y
CONFIG_GREEN=y (This shouldn't be here)

저는 정규 표현식을 처음 접했습니다. 내가 뭘 잘못하고 있는지 아시나요?

스크립트의 반복 코드 조각(test1.txt, test2.txt 등 허용)은 현재 1개의 파일만 사용하며 더 많은 파일로 확장되지 않았습니다.

for i in test*.txt
do
  sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test.txt
done

답변1

GNU를 사용한다고 가정하면 루프는 sed파일에서 정규 표현식이 일치할 때마다 줄을 추가합니다. 쉘 와일드카드 패턴과 일치하는 현재 디렉토리의 각 파일 이름에 대해 동일한 파일에 동일한 행을 반복적으로 추가합니다.# CONFIG_GREEN=yCONFIG_BLUEtest.txttest*.txt

에 두 줄의 텍스트를 추가하려면 test.txt다음을 수행하세요.

  1. test*.txt현재 디렉터리에 일치하는 파일 이름을 가진 다른 파일이 존재합니다.
  2. 루프가 실행되기 전에도 이전 실행에서 텍스트 줄이 이미 파일에 있거나
  3. 실행 중이라고 생각하는 코드가 실행되고 있지 않습니다.

의 판단논평, 이는 세 가지 경우 중 두 번째입니다.

루프를 수정하려면 실제 호출에서 루프 변수를 사용하십시오 sed.

for name in test*.txt; do
  sed -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' "$name"
done

현재는 파일을 수정하지 않고도 결과를 확인하고 다시 실행할 수 있도록 -iGNU 옵션을 제거했습니다 . sed적절한 수의 파일이 있는 경우 sed파일 이름 글로빙 패턴을 사용하여 직접 호출을 수행하여 모든 파일에 대해 순서대로 작업할 수 있습니다. GNU를 사용하는 경우 -i여기에서 내부 편집도 수행할 수 있습니다.sed

sed -i -e '/CONFIG_BLUE/a\' -e '# CONFIG_GREEN=y' test*.txt

관련 정보