파일 상단에 두 줄의 주석을 추가하십시오. [중복]

파일 상단에 두 줄의 주석을 추가하십시오. [중복]

변경하고 새 파일을 출력하는 sed 스크립트를 만들려고 하는데 출력 파일 자체가 bash 스크립트로 실행될 수 있도록 상단에 두 개의 주석 줄을 추가해야 합니다. 문제는 두 개의 맨 위 줄을 추가하기 위해 본 모든 솔루션이 주석과 함께 작동하지 않아 스크립트 자체가 실행되지 않는다는 것입니다.

예를 들어, 내 sed 결과가 다음과 같은 파일인 경우:

AAAA
BBBB
CCCC
DDDD

나는 다음과 같이 끝내고 싶습니다.

#$ -cwd
#$ -pe mpi 16

AAAA
BBBB
CCCC
DDDD

나는 다음과 같은 변형을 시도했습니다.

sed -i '1s/^/#$ -cwd\n/' output.txt

그러나 이들은 # 이후의 모든 것을 주석으로 처리합니다.

혼란스럽지 않고 주석 제목을 추가하기 위해 bash 스크립트를 어떻게 작성할 수 있습니까? 감사해요!

답변1

Kusalananda의 답변은 항상 작동하기 때문에 아마도 가장 좋은 솔루션일 것입니다. 그러나 sed만 사용하면 솔루션도 작동한다는 것도 확인했습니다.

$ cat output.txt 
AAAA
BBBB
CCCC
DDDD
$ sed '1i#$ -cwd\n#$ -pe mpi 16\n' output.txt 
#$ -cwd
#$ -pe mpi 16

AAAA
BBBB
CCCC
DDDD

기본적으로 (s) 대체 대신 sed의 (i)nsert 명령을 사용하십시오.
1- 라인 1에서 작동 -
i라인 1 앞에 삽입
1i- 라인 1 앞에 삽입

이것은 gnu sed 4.8에서 작동합니다. 청소년MMV

답변2

함께 사용할 때 특수 문자 등을 인용해야 하는 모든 문제를 피하려면 sed여기에 인용된 문서를 사용하십시오.

cat - output.txt <<'END_COMMENTS' >newfile.txt
#$ -cwd
#$ -pe mpi 16

END_COMMENTS

이렇게 하면 추가 텍스트 세 줄이 기존 파일의 내용과 연결되고 output.txt결과 텍스트가 에 저장됩니다 newfile.txt. 원하는 경우 이름을 바꿀 수 있습니다 newfile.txt.output.txt

여기서는 명령 이 cat두 개의 매개변수와 함께 사용됩니다.

  1. -cat; 표준 입력에서 먼저 읽도록 지시합니다 . 표준 입력 스트림에는 제목 텍스트가 포함된 이 문서가 포함됩니다.
  2. output.txt;이것은 기존 파일입니다. 표준 입력에 도착하는 모든 데이터를 읽었을 때 읽혀집니다.

시험:

$ cat output.txt
AAAA
BBBB
CCCC
DDDD

>다음 줄 시작 부분에 있는 프롬프트는 bash명령을 완료하기 위해 추가 입력이 필요할 때 사용되는 쉘의 보조 프롬프트입니다.

$ cat - output.txt <<'END_COMMENTS' >newfile.txt
> #$ -cwd
> #$ -pe mpi 16
>
> END_COMMENTS
$ cat newfile.txt
#$ -cwd
#$ -pe mpi 16

AAAA
BBBB
CCCC
DDDD

최종 출력이 쉘 스크립트여야 하는 경우 헤더의 첫 번째 줄은 bash인터프리터 #!의 절대 경로 이름이 포함된 -line 이어야 합니다 bash.


다음을 사용할 수도 있습니다 printf.

printf '%s\n' '#$ -cwd' '#$ -pe mpi 16' '' |
cat - output.txt >newfile.txt

printfhere 문서를 사용하는 대신 세 줄의 제목 텍스트를 생성하는 데 사용됩니다 . 결과는 동일하지만 더 보기 흉해 보일 것이며 제목 텍스트가 실제로 어떻게 보이는지 확인하려면 코드를 이해해야 합니다(물론 실행하지 않는 한).

관련 정보