sed를 사용하여 다른 파일에서 새 줄을 추가하는 방법

sed를 사용하여 다른 파일에서 새 줄을 추가하는 방법

에 넣을 sed수 있도록 명령을 찾으려고 합니다 . 이것은 두 개의 별도 파일입니다.filenamefilename1

입력은 다음 filename과 같습니다.

Cindy   11 22 54
Chester 48 12 84

입력은 다음 filename1과 같습니다.

 Name  Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96


Jefferry 84     98     90

이것이 내가 필요한 결과(출력)입니다.

Name   Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96
Cindy    11     22     54
Chester  48     12     84
Jefferry 84     98     90

명확히 해야 할 사항이 있으면 알려주시기 바랍니다. 기본적으로 Cindy와 Chester는 Dora와 Jeffrey 사이 어딘가에 있어야 합니다.

답변1

명령을 사용하여 의 모든 줄을 추가하려면 filename다음을 수행할 수 있습니다.filename1sed

sed r filename1 filename

그러나 결과는 귀하의 질문에 나온 결과와 약간 다를 수 있습니다. 즉, 다음과 같습니다.

Name  Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96
Jefferry 84     98     90
Cindy    11     22     54
Chester  48     12     84

편집하다

sed이 질문에 유용한 추가 정보는 다음과 같습니다.

  • filename4행 뒤에 다음을 추가합니다 filename1.

    sed '4 r filename' filename1

  • 아래에 filename"Dora"로 시작하는 줄을 추가하려면 다음을 수행하세요 filename1.

    sed '/^Dora/ r filename' filename1

  • filename4행 뒤에 모든 빈 행을 추가하고 제거하려면 다음을 수행하십시오 filename1.

    sed '/^$/d;4 r filename' filename1

답변2

내 기억이 맞다면 순서가 없을 것이다.

이 경우:

$ cat file2 file1 | column -t
Name      Class1  Class2  Class3
Lee       92      94      88
Chancy    91      85      95
Dora      99      77      96
Jefferry  84      98      90
Cindy     11      22      54
Chester   48      12      84

답변3

이렇게 하면:

sed r file1 file2

... 그런 다음 명명된 입력 파일의 각 입력 줄에 널 길이 파일 이름을 가진 ead 파일을 추가하려고 sed시도하지만 실패합니다.rfile1그리고file2. 이 명령은 기본적으로 다음 명령과 다르지 않습니다.

sed '' file1 file2

...느린 점만 빼면요 r.

이것이 내가 의미하는 바입니다:

seq 1  5 > file1
seq 6 10 > file2
strace sed r file[12]

...
write("1\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("2\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("3\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("4\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("5\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
read(3, "", 4096) = 0
close(3) = 0
open("file2", RDONLY) = 3
write("6\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("7\n", 21) = 2
...

open("" ...)고장상황을 확인하세요ENOENT쓰여진 모든 줄을 따르시겠습니까? 빈 read 명령이 sed실행되면 이런 일이 발생합니다. sed사양은 r스크립트에 지정된 존재하지 않는 ead 파일 에 대해 불평하지 않지만 r파일을 읽으려고 시도하는 동안 아무 일도 일어나지 않은 것처럼 계속되므로 이러한 실패를 알 수 없습니다.

어쩌면 그럴지도것 같다하나의 파일을 다른 파일의 끝에 추가하고 싶기 때문에 작동 방식과 같습니다. cat두 파일을 연결합니다. sed기본적으로 두 개의 입력 파일 이름이 지정되면 첫 번째 파일을 읽은 다음 다음 파일을 읽습니다. 그러나 read 명령이 작동하면 명명된 read 파일이 완전히 추가됩니다.모든입력 라인.

이와 같이:

seq 3 > file
printf %s\\n a b c | 
sed r\ file

a
1
2
3
b
1
2
3
c
1
2
3

한 파일의 내용을 다른 파일에 추가하려면 다음을 수행하세요.

cat < file2 >> file1

입력의 특정 지점 뒤에만 추가하려면 몇 가지 옵션이 있습니다. sed안에:

sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1

...거의 모든 작업에 사용할 수 있습니다 sed.

또는 POSIX가 있는 경우 sed:

{ sed /match/q; cat file2 -; } < file1

...더 효율적이겠죠.

두 가지 방법 모두 콘텐츠가file2한 번만 읽고 in r이 처음 발생한 직후에만 읽 습니다.matchfile1.

또 다른 방법은 다음과 같습니다.

cat file2 | sed /match/r\ /dev/fd/0 file1

...이것은 첫 번째 게임 이후 각 게임 후에 빈 길이의 파일을 읽습니다...

관련 정보