File1
содержание:
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
File2
содержание:
line1-file2 "25"
line2-file2 "24"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
После выполнения сценария perl / shell File2
содержимое должно стать:
line1-file2 "25"
line2-file2 "24"
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
т.е. вставьте содержимое File1
в File2
перед строкой, которая содержит «Указатель».
text-processing
awk
sed
perl
user1228191
источник
источник
Ответы:
sed
имеет функцию для этого, и может сделать модификацию inline:Но это помещает вашу строку указателя выше файла1. Чтобы поставить его ниже, задержите вывод строки:
источник
-e 1x -e '2,${x;p}' -e '${x;p}'
делать? Я понимаю, что вы обмениваетесь данными в буфере шаблонов, а затем распечатываете их, но я не знаю, что и почему вы добавили тихую опцию-n
в начале.Без использования
sed
илиawk
...Сначала найдите строку, на которой находится ваш шаблон:
Затем используйте 3 команды для вывода желаемого результата:
Это имеет недостаток доступа в 3 раза файл
file2
, но может быть яснее , чемsed
изawk
раствора.источник
awk
делает это довольно легко.Вставьте строку перед файлом:
Чтобы внутренний файл печатался после
Pointer
строки, просто измените порядок шаблонов (вам нужно добавить точку с запятой, чтобы получить действие по умолчанию), и вы можете удалитьline
переменную:И только потому, что никто еще не использовал
perl
,источник
system("cat innerfile")
выводитinnerfile
на консоль. Я что-то пропустил?Простая работа для
ed
:-r file1
читает в указанном файле после адресной строки, которая в этом случае является строкой, предшествующей первой строке соответствияPointer
. Так что это будет вставлять содержимоеfile2
только один раз, даже еслиPointer
происходит в несколько строк. Если вы хотите вставить его перед каждой соответствующей строкой, добавьтеg
флаг lobal:Замените
,p
на,w
если вы хотите редактировать файл на месте.Принятый
sed
ответ работает в большинстве случаев, но если маркер находится в последней строке, команда не будет работать должным образом: она будет вставлять содержимоеFile1
после маркера.Я изначально пытался с:
который также работает нормально (как
r
и в конце цикла), но имеет ту же проблему, если маркер находится на последней строке (N
после последней строки нет строки ext). Чтобы обойти это, вы можете добавить новую строку в ваш ввод:Это будет вставлять
file2
контент перед каждой соответствующей строкой. Чтобы вставить его только перед первой совпадающей строкой, вы можете использоватьl
oop и просто тянуть вn
строку ext, пока не дойдете до конца файла:С этими
sed
решениями вы теряете возможность редактировать на месте (но вы можете перенаправить в другой файл).источник
Используйте цикл для чтения строк в file2. Если вы найдете строку, начинающуюся с
Pointer
, то распечатайте файл1. Это показано ниже:источник
Есть несколько способов сделать это
sed
. Одним из способов является задержка чтения, как рекомендуется в принятом ответе. Это также можно записать так:... с небольшим явным упреждением вместо того, чтобы предвидеть, реализованным в другом месте с буфером удержания. Это неизбежно приведет к той же самой проблеме с последней строкой, которую @don_crissti отмечает, хотя, потому что
N
действительно увеличивает цикл строки, и командаr
ead применяется к номеру строки.Вы можете обойти это:
Не все
sed
s будут интерпретировать,-
чтобы означать стандартный ввод, но многие делают. ( POSIX говорит,sed
что поддержка-
должна означать стандартный вход, если разработчик хочет-
означать стандартный вход ???)Другой способ - обработать добавленное содержимое по порядку. Есть другая команда, которая планирует вывод таким же образом
r
, как и ead, иsed
будет применять его иr
ead в порядке, в котором они написаны. Хотя это немного сложнее - это влечет за собой использование одного,sed
чтобыa
связатьPointer
совпадение с выводом другогоsed
в его сценарии.Так что в основном первый
sed
пишет второйsed
скрипт, который второйsed
читает на стандартном вводе (может быть ...) и применяет по очереди. Первыйsed
работает только для первого совпадения дляPointer
найденного, а затемq
для ввода данных. Его работа заключается в ...s/[]^$&\./*[]/\\&/g;H
sed
должен интерпретировать каждый бит, который он читает буквально, чтобы сделать его правильным. Как только это будет сделано, поместите копию вH
старое место.s|.*|/&/!p;//!d|p; x
sed
чтобы онаp
набирала каждую строку ввода,!
кроме той, которую/&/
мы только что сохранили по шаблону; а потом наd
эле все то же самое.p
Снова наберите командыsed
, затемx
изменитеh
старый и шаблонный буферы для работы с нашей сохраненной копией.s|.|r file1&a\\&|p;q
\n
ewline, потому что онsed
будет добавлен перед тем, как мы с ним раньше справилисьH
. Таким образом, мы вставляем командуr file1
и следуем за ней с помощью нашей\n
ewline, затем за командой ppend,a\\
заa
которой следует также\n
ewline. Вся остальная часть нашейH
линии поля следует этой последней\n
линии.Сценарий, который пишет первым, выглядит примерно так:
По сути, вторая
sed
будет печатать каждую строку, а перваяsed
- дляa
ppend. Для этой конкретной строки запланированы две отложенные записи в стандартный вывод: первая - это EAD, а вторая - копия строки, которую мы хотим после нее. В этом случае лечение первого даже не требуется (видите? Без обратной косой черты), но важно безопасно избежать того, что я делаю здесь, всякий раз, когда сопоставление с образцом повторно используется в качестве входных данных.r
file1
sed
Во всяком случае, так что ... есть несколько способов.
источник
Это довольно просто с AWK:
Файл1 в Файл2 до шаблона = "Указатель"
Сначала загрузите содержимое файла File1 в переменную
затем сделайте вставку
(Или, если вы хотите вставить File1 после «Pointer»)
источник
мой любимый способ: шаблонизация .
Это заменит каждый случай CHANGEME в origfile содержимым file2insert . Удалите последний g из sed, чтобы заменить только первое вхождение CHANGEME .
источник
$x
в своей первой команде, когда она определена только во второй команде?[Вставить содержимое файла в другой файл ДО шаблона]
[После шаблона]
источник
N
работает хорошо, но не в том случае, если PATTERN соответствует последней строке вводаисточник