모든 파일을 반복하고 파일 헤더를 삽입합니다.

모든 파일을 반복하고 파일 헤더를 삽입합니다.

다음과 같은 더미 프로젝트가 있다고 가정합니다.

$tree -L 3 ~/my-proj
./dir/foo.sh
./bar.sh

모든 *.sh 파일에 저작권 파일 헤더를 삽입하고 싶습니다. 예를 들어 내 헤더는 다음과 같습니다.

/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */

여러 줄로 인해 어려움을 겪고 있습니다. 아래에 스크립트를 작성했지만 여러 줄에서는 작동하지 않습니다.

#!/bin/sh
HEADER=$(cat<<EOH
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
)

find ~/my-proj/*.sh -exec sed -i "1s/^/$HEADER\n/" {} \;

답변1

이것을 사용하십시오:

header='/*\n *  Copyright (c) 2015 by MyCompany, Inc.\n *  All rights reserved.\n */\n'
find ~/my-proj/*.sh -exec sed -i "1s|^|$header|" {} \;

노트:

  1. 쉘은 값을 $headersed 명령으로 직접 대체합니다. 이를 통해 sed 스크립트에 임의의 명령을 삽입할 수 있습니다. 하다~ 아니다.header

  2. 헤더에 /문자가 포함되어 있습니다. 해당 문자를 이스케이프해야 하거나 대체 명령이 다른 구분 기호를 사용해야 합니다. 위에서는 |구분 기호로 사용되었습니다.

  3. 쉘 변수에는 소문자 또는 대소문자 혼합을 사용하는 것이 가장 좋습니다. 시스템은 변수에 대문자를 사용하며 이 경우에는 문제가 되지 않지만 실수로 덮어쓰는 것을 원하지 않습니다.

수정된 sed 명령을 설명하려면 다음 테스트 파일을 고려하세요.

$ cat file
1
2
3

sed 명령은 다음을 생성합니다.

$ sed "1s|^|$header|" file
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
1
2
3

관련 정보