Вставьте текст из файла, встроенного после соответствия шаблону в другом файле

Из комментария OP:

Выпущенный, что установка, по некоторым причинам, разрозненные данные на всем протяжении диска. Я восстановил cat /dev/zero > /mounted_drive/zero после установки и затем удаленный файл и восстановил dd, оказавшийся файл на 1.3 ГБ после gzip.

С этим на вопрос эффективно отвечают (и, как побочный эффект, удаленный из Оставшейся без ответа очереди Вопросов).

7
10.12.2014, 02:19
3 ответа

В вашем связанном вопросе уже хорошо AWK Ответ, просто измените его немного с помощью Printf вместо Print Чтобы вставить содержимое без новой строки:

awk '/First/ { printf $0; getline < "File1.txt" }1' infile.txt

Результат:

Some Text here
FirstThis is text to be inserted into the File.
Second
Some Text here

Вы можете добавить пространство или другой делиметр после «первого» с printf $ 0 ""; ...


Если вставленный файл имеет много строк, то:

awk '/First/{printf $0; while(getline line<"File1.txt"){print line};next}1' infile.txt

Результат:

Some Text here
First[
    {
        "foo": "bar", 
        "baz": "biff",
        "data": [
            {
                "a": 1945619, 
                "b": [
                    {
                        "c": 512665, 
                        "d": "futz"
                    }
                ]
            }
        ]
    }
]
Second
Some Text here
5
27.01.2020, 20:15

Если вы находитесь , вошли в локальный компьютер , вы будете использовать SCP , как это:

scp /home/username/some.xml root@remote.machine.ip.address:/path/to/directory/

, если вы , вошли в удаленный компьютер (как В ОП) используйте SCP , как это:

scp username@local.machine.ip.address:/home/username/some.xml /path/to/directory

замените IP-адреса по указанию в командах.

-121--42162-

Так было бы немного сложно сделать эту работу портативно в SED - вы должны смотреть на , вырезать и / или При некоторых предшественниках Regex создают свой скрипт в этом контексте - и это связано с SED , всегда будет вставлять \ N EWLINE до . Выход R EAD. Тем не менее, W / GNU SED :

sed '/First/{x;s/.*/cat file/e;H;x;s/\n//}' <<\IN 
First
Second
Third
IN

, который работает E Xecuting CAT Каждый раз, когда он сталкивается с вашим / первым / адресом. Это делает это в h H H (в любом случае - альтернативный буфер - потому что я е x Измените их, это на самом деле происходит в шаблоне пространства, который используется для H Старое пространство) Для сохранения содержимого соответствия линии сначала , а затем добавляются CAT вывод на вашу строку и удаляет вмешательство \ N Ewline.

Вывод:

First[
    {
        "foo": "bar", 
        "baz": "biff",
        "data": [
            {
                "a": 1945619, 
                "b": [
                    {
                        "c": 512665, 
                        "d": "futz"
                    }
                ]
            }
        ]
    }
]
Second
Third

Теперь, если вы хотите, если вы хотите, чтобы все содержимое файла в соответствии со между в две части линии, которая должна работать немного по-другому, потому что с вышеупомянутой командой я просто удаляю трейлинг Newline между концом соответствующей линии и начало файла. Тем не менее, вы можете сделать это тоже:

sed '/First/{s//&\n/;h
         s/.*/{ cat file; echo .; }/e;G
         s/\(.*\).\n\(.*\)\n/\2\1/
}' <<\IN
Third
Second
First Second Third
Third
Second
First Second Third
IN

, который разбивает линию в матче с \ N символом EWLINE, сохраняет его в H , E Xecutes CAT CAT - который заменяет пространство шаблонов с его выходом - G ETS. Содержимое пространства удержания, добавленное к нашему новое пространство шаблона, следующее за другим \ N EWLINE Персонаж, а затем переставляет на \ N разделители EWLINE.

Я делаю Echo. Чтобы сохранить любые трейлинг \ N символов EWLINE в файле - но если это не ваше желание (и все равно не очень актуальны для вашего примера) Вы можете обойтись без него и удалить первый . До . \ N в следующем /// Ubstitution.

Незадолго до того, как пространство шаблона перестройки выглядит так:

^cat's output - any number of newlines.*.\nmatch on First\nrest of match$

Выход:

Third
Second
First[
    {
        "foo": "bar", 
        "baz": "biff",
        "data": [
            {
                "a": 1945619, 
                "b": [
                    {
                        "c": 512665, 
                        "d": "futz"
                    }
                ]
            }
        ]
    }
] Second Third 
Third
Second
First[
    {
        "foo": "bar", 
        "baz": "biff",
        "data": [
            {
                "a": 1945619, 
                "b": [
                    {
                        "c": 512665, 
                        "d": "futz"
                    }
                ]
            }
        ]
    }
] Second Third
5
27.01.2020, 20:15

Вы могли бы использовать Perl (получите содержимое файла и замена Pattern с с Pattern + Содержание файла ):

perl -pe '$text=`cat insert.txt`; chomp($text); s/PAT/$&$text/' file.txt

Добавить -I для редактирования на месте; G Чтобы добавить после каждого происшествия PAT (шаблона), например:

perl -i -pe '$text=`cat insert.txt`; chomp($text); s/PAT/$&$text/g' file.txt

другой способ, используя ED :

printf '%s\n' /PAT/s/PAT/\&\\ \/ - kb ". r insert.txt" j \'b j ,p q | ed -s file.txt

для редактирования на месте, заменить , p с W W :

 printf '%s\n' /PAT/s/PAT/\&\\ \/ - kb ". r insert.txt" j \'b j w q | ed -s file.txt

, вероятно, никто не заинтересован, как это работает, но в любом случае, Printf передает список команд ED :

/PAT/s/PAT/&\             #   set address to first line matching PAT and
/                         #   split the line right after PAT
-                         #   set address one line before (return to the line matching PAT)
kb                        #   mark the current line
. r insert.txt            #   insert content of insert.txt after this line         
j                         #   join current line and the next
'b                        #   set  address to marked line (return to the line matching PAT)
j                         #   join current line and the next one
,p                        #   print file content
q                         #   quit editor

или , без использования printf и : :

ed -s file.txt <<< $'/PAT/s/PAT/&\\\n/\n-\nkb\n. r insert.txt\nj\n\'b\nj\nw\nq\n'
6
27.01.2020, 20:15

Теги

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