파일의 첫 줄 앞에 텍스트를 삽입하는 방법은 무엇입니까?


76

sed특정 줄의 파일에 텍스트를 추가하는 명령을 둘러 보았습니다 . 이것은 라인 1 뒤에 텍스트를 추가하는 데 효과적입니다.

sed '1 a\

그러나 나는 그것을 줄 1 앞에 추가하고 싶습니다 .

sed '0 a\

하지만이 오류가 발생합니다 : invalid usage of line address 0.

어떠한 제안?


답변:


101

앞 줄에 텍스트를 삽입하는 sed'삽입 ( i) 옵션을 사용하십시오 .

sed '1 i\

질문 작성자의 업데이트 :

GNU에서 파일을 제자리에 편집하려면 옵션 sed을 추가해야했습니다 -i.

sed -i '1 i\anything' file

또한 구문

sed  -i '1i text' filename

비 sed의 경우

백 슬래시 직후 1i\와 이후에 리턴 키를 눌러야합니다 first_line_text.

sed -i '1i\
first_line_text
'

또한 GNU 이외의 일부 sed구현 (예 : macOS의 구현) 에는-i 플래그에 대한 인수가 필요 합니다 ( -i ''GNU와 동일한 효과를 얻기 위해 사용 sed).


1
-i옵션 이 없으면 작동하지 않습니다 . 수락하기 전에 답변을 업데이트하겠습니다.
— Manolo

1
감사. 어떤 OS를 사용하고 있습니까? 오리지널 솔루션은 OpenSuse 9에서 작동했습니다.
— suspectus

1
흥미 롭습니다! 나는 Lubuntu 13.10을 사용하고 sed '1 i\this text is entered above the existing first line' file나를 위해 일합니다.

2
여기에 사용하는 sed (GNU sed) 4.2.2바로 sed '1 i text to insert' -i file마법처럼 일했다. 감사
— 톤

1
@FeRD awk아래의 불량 순위 답변을 참조하십시오. 이 작동합니다.
— rudimeier

18

에코는 텍스트를 얻는 데 사용됩니다. Cat filename-콘솔에서 파일을 인쇄하고>를 사용하여 다른 파일 filename1로 전송 한 다음 filename1을 filename으로 이동하여 원하는 파일의 첫 번째 줄에 텍스트를 삽입합니다.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename

7
다음 내용이 다운 보트 인 이유를 알려주세요
— Ankit Shah

1
아마도 OP가 sed를 언급했기 때문일 것입니다. 내 의견으로는 다운 투표권이 없다. 그 솔루션은 심지어 내 요구에 가장 잘 맞는 것이었고 공감했습니다.
— рüффп

나는 공감했다. 나를 위해 ksh에서 작동합니다.
— arcee123

16

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

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 첫 줄을 선택하십시오

  2. i 텍스트와 개행 삽입

  3. x 저장하고 닫습니다


7

당신은 할 삽입 첫 번째 행하기 전에 텍스트보다는 추가 한 후 그것을, 그래서 사용

sed '1 i\
your_text' your_file

here 문서도 도움이 될 수 있습니다.

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI

6

GNU awk> = 4.1 사용 :

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

모든 sed답변 과는 반대로 이것은 빈 파일에서도 작동합니다.


inplace불행히도 라이브러리는 모든 awk 배포판에 나타납니다. "awk : 치명적 : 읽기 위해 소스 파일 'inplace'를 열 수 없습니다"GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
— vossad01

6
sed  -i '1i new_text' file_name

-i옵션을 지정하지 않으면 오류가 표시되지 않고 표준 터미널에 출력이 표시되지만 파일에는 텍스트가 삽입되지 않습니다.


문제는 -i스위치 에 관한 것이 아닙니다 .
— don_crissti

어떻게 알아? 그것은 이다 질문에 대한 답변. 예, 허용되는 답변 과 비슷 하지만 정확히 동일하지는 않습니다.
— G-Man

@ G-Man-cas에서 사용하는 템플릿이 이상적이지는 않지만 실제로 는 거의 동일하지만 간격이 다르고 백 슬래시가 없다는 사실의 차이점 과 비슷 합니다. (그들은 둘 다 마찬가지로 지금까지 내가 걱정으로 그들은 기술적으로 동일한 특정하고 그냥 그렇게 을 받아 백 슬래시없이). 다른 사람들이 이것이 별도의 대답 + 공감대를 요구한다고 생각한다면 ... 오 잘. gnu sedgnu sedi
— don_crissti

2

0a시도한 명령은 않습니다 에서 작동 ex, 전신에를vi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

printf자체 명령 출력 :

0a
Anything you want to add
.
x

이 0a수단은 0 번째 줄 뒤에 (즉, 첫 번째 줄 앞에) 추가합니다.

다음 줄 또는 여러 줄 은 추가 할 리터럴 텍스트입니다.

.자체의 라인은 "추가"명령을 종료합니다.

x원인 예는 파일 종료에 대한 변경 사항을 저장합니다.


1

이 오래된 질문에서 아무도 가장 일반적인 sed 명령을 보지 못했다는 것에 놀랐습니다.

$ sed  -i '1s/^/new_text\
/' file_name

대부분의 쉘에서 작동하며 여러 sed 버전으로 이식 가능합니다.
GNU sed가 사용 가능한 경우 다음을 사용할 수 있습니다.

$ sed -i '1s/^/new_text\n' file_name

차이점은 GNU sed \n가 줄 바꿈에 대한 사용을 허용 하고 다른 줄에는 백 슬래시가 앞에 오는 리터럴 줄 바꿈이 필요하다는 것입니다 (GNU sed에서도 작동합니다).

$'…'구문 을 허용하는 쉘이 사용중인 경우, 개행을 직접 삽입 할 수 있으므로 sed는 개행이 이미 존재 함을 확인합니다.

$ sed -i $'1s/^/new_text\\\n/' file_name

더 많은 sed 버전에서 작동합니다.


-1

불행히도, 위의 모든 답변 (주로 sed)은 모두 첫 번째 줄을 대체했기 때문에 나에게 적합하지 않았습니다. 나는 Ubuntu 16.04 LTS기계 위에있다 . 여기 내 해결 방법이 있습니다 GNU Awk 4.0.2.

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name

1
무슨 말을하는지 잘 모르겠습니다. sed대체를 사용하는 답변은 하나 뿐이지 만 기존 줄을 대신하지는 않습니다.
— don_crissti

-1

처음과 마지막

파일의 시작 / 끝에 텍스트를 삽입 / 추가하는 방법을 검색 한 사람은 다른 작업을 수행하는 방법도 알아야한다고 가정합니다.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

설명

이다 cal출력 gnu-로 파이프 sed(전화 gsed를 통해 설치된 맥 OS에 brew.sh 확장 정규식 (과) -E) 및 6 "스크립트"적용 ( -e)와 함께 탈출 줄 바꿈 \가독성. 스크립트 1과 2는 1i\"1 행에 삽입"하는 데 사용합니다. 스크립트 5 및 6 $a\은 "<last> 라인에 추가"하는 데 사용합니다. 코드가 결과에서 예상되는 것을 나타내도록 텍스트 출력을 세로로 정렬했습니다. 스크립트 3 & 4는 대체 (후자는 "line <last>"에만 적용됨)를 수행합니다. 결과는 명령 출력을 유효한 JSON으로 변환하는 것입니다.

산출

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}

귀하의 질문에 투표하지 않았지만, 우리는 이미 원하시는 결과를 보여주는 몇 가지 답변을 포함하고 있습니다.
— Jeff Schaller

@JeffSchaller Stack Exchange 커뮤니티는 포럼이 아닙니다. 그 목적은 OP가 차단되지 않도록 돕는 것 이상으로 확장됩니다. 목표는 구직자가 답변을 검색 할 때 우연히 발견 할 수있는 많은 옵션으로 글로벌 지식 기반을 구축하는 것입니다. 내가 답변의 제목을 지정한 이유는 사용자가 Google 결과를 클릭하기 전에이 답변의 유틸리티를 인식하도록하기 위해서입니다.
— Bruno Bronosky

내가 말하는 것은 귀하의 답변 이이 질문을 읽는 독자에게 새로운 옵션 (답변)을 제공하지 않는다는 것입니다. 1i첫 번째 줄 앞에 텍스트를 삽입하기 위해 변형을 사용하는 네 가지 답변이 이미 있습니다 . 이 질문을 가진 사람은 문제를 해결하기 위해 답에서 필요한 부분을 추출해야합니다. 질문은 무료이므로 특정 답변을 제공하기 위해 자신의 질문을하고 답변하도록 초대합니다.
— Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.