변경하고 새 파일을 출력하는 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
두 개의 매개변수와 함께 사용됩니다.
-
cat
; 표준 입력에서 먼저 읽도록 지시합니다 . 표준 입력 스트림에는 제목 텍스트가 포함된 이 문서가 포함됩니다.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
printf
here 문서를 사용하는 대신 세 줄의 제목 텍스트를 생성하는 데 사용됩니다 . 결과는 동일하지만 더 보기 흉해 보일 것이며 제목 텍스트가 실제로 어떻게 보이는지 확인하려면 코드를 이해해야 합니다(물론 실행하지 않는 한).