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


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.