Как добавить новые строки из другого файла с sed

if len(file) >= 5 chars
   then ren(file) $_;
end if
3
14.10.2014, 03:26
3 ответа

Чтобы добавить все линии из имя файла - filename1 Использование SED Можете сделать следующее:

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 Информация, полезная для этого вопроса:

  • ​​Чтобы добавить filename после 4-й строки filename1 :

    SED '4 R Filename' Filename1

  • , чтобы добавить Filename После строки, которая начинается с «Дора» в filename1 :

    Sed '/ ^ ^ ^ r / r Имя файла файла1

  • , чтобы добавить filename после 4-й строки и удалить любые пустые строки из Filename1 :

    SED '/ ^ $ / D; 4 r Filename' filename1

7
27.01.2020, 21:09

не должно быть никакого заказа, если я правильно запомню.

В этом случае:

$ 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
2
27.01.2020, 21:09

Если вы сделаете:

sed r file1 file2

... тогда sed попытается и не сможет добавить файл ead r с именем файла нулевой длины в каждую строку ввода обоих его именованные входные файлы файл1 и файл2 . Эта команда по сути ничем не отличается от:

sed '' file1 file2

... за исключением того, что w / 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 после каждой написанной строки? Это пустая команда r ead sed . Вы не замечаете сбоев, потому что sed спроектирован так, чтобы не жаловаться на несуществующий файл r ead, указанный в его скрипте, а скорее продолжать работу, как будто ничего не произошло когда он пытается r отозвать.

И, возможно, это выглядит так, как будто это работает, потому что вы просто хотите добавить файл в конец другого - чтобы con cat enate два файла, что sed работает по умолчанию, когда названы два входных файла - он читает первый, а затем следующий. Но если бы команда r ead действительно работала, то именованный файл r ead был бы полностью добавлен к каждой строке ввода.

Примерно так:

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 будет только r удалено один раз и только сразу после первого появления match в file1 .

Другой способ мог бы выглядеть так:

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

... который считывал бы файл нулевой длины после каждого совпадения, следующего за первым ...

2
27.01.2020, 21:09

Теги

Похожие вопросы