여러 sed 문에 대해 sed 인라인 편집이 실패함

여러 sed 문에 대해 sed 인라인 편집이 실패함

#SB#주어진 문자열과 일치하는 각 줄의 시작 부분에 추가하고 싶습니다

inkron.sh

sed -i -e'/test1/s/^/#SB#/g' file1
sed -i -e'/test2/s/^/#SB#/g' file1
sed -i -e'/test4/s/^/#SB#/g' file1

파일 1

/apps/pmserver $ cat file1
00 45 /ser/bat/ab.sh test1
00 45 /ser/bat/ab.sh test2
00 45 /ser/bat/ab.sh test3
00 45 /ser/bat/ab.sh test4
/apps/pmserver $

저는 코헨 쉘을 사용하고 있습니다.

sed새 파일로 출력할 수 있지만 스크립트에 여러 개의 명령문이 있으면(위 그림 참조) 작동하지 않습니다. 오류가 발생했습니다.

sed: Not a recognized flag: i

내가 하고 싶은 것은 crontab특정 팀에 속한 일부 항목을 주석 처리하는 것입니다. test1 test2...는 해당 파일 이름이므로 닫아야 합니다.

답변1

sed의 매개변수는 -iGNU 확장입니다. GNU sed를 실행하고 있지 않을 수 있으므로 -i인식되지 않는다는 오류가 발생합니다.

답변2

귀하의 sed는 (아마도) GNU가 아니므로 내부 편집을 위해 -i를 지원하지 않습니다. 임시 파일을 사용하면 이를 방지할 수 있습니다.

sed -i -e'/test1/s/^/#SB#/g' file1

~이 되다

sed -e'/test1/s/^/#SB#/g' file1 > temp_file
mv temp_file file1

물론 이와 같이 mktemp를 사용하면 더 잘할 수 있습니다.

tmpfile=`mktemp`; sed -e '/test1/s/^/#SB#/g' file1 > $tmpfile; mv $tmpfile file1

전적으로피하다원본 파일이 잘리므로 임시 파일 없이 sed 및 리디렉션을 수행합니다.

답변3

Ex 모드에서 Vim을 사용할 수 있습니다:

ex -sc 'g/\vtest(1|2|4)/s/^/#SB#/' -cx file1
  1. g전역 정규식

  2. \v마법을 켜세요

  3. s바꾸다

  4. x저장하고 닫습니다

답변4

답변에서는 이것이 -i비표준이라고 설명하고 임시 파일을 사용하는 방법도 설명하지만 여러 명령문에 대해 이를 수행하는 방법에 대한 주요 문제를 무시합니다.

물론 각 명령문을 리디렉션하고 각 명령문 다음에 다시 복사할 수 있습니다. 그러나 어쨌든 sed각 명령문에 대해 별도의 호출이 필요하지 않으며 다음을 사용하여 여러 스크립트를 지정할 수 있습니다 -e.

sed -e '/test1/s/^/#SB#/g' -e '/test2/s/^/#SB#/g' -e' /test4/s/^/#SB#/g' file1

sed또는 다음을 사용하여 명령을 연결할 수 있습니다 ;.

sed '/test1/s/^/#SB#/g;/test2/s/^/#SB#/g;/test4/s/^/#SB#/g' file1

귀하의 예에서는 대체 항목을 결합하는 정규식을 찾을 수도 있습니다.

sed '/test[124]/s/^/#SB#/g' file1

스크립트를 개선하면 명령 g의 플래그는 s"줄에 있는 모든 항목 바꾸기"를 의미하지만 각 줄에는 시작( ^)만 있으므로 이를 제거할 수 있으므로 최종 작업은 다음과 같습니다.

sed '/test[124]/s/^/#SB#/' file1 > /tmp/file1 && mv /tmp/file1 file1

( 실패 시 파일 손상을 &&방지하는 데 사용됨 )sed

관련 정보