«неверный флаг в команде замены: '{" при замене строки с помощью sed из одного файла в другой файл

«неверный флаг в команде замены: '{" при замене строки с помощью sed из одного файла в другой файл

Я пытаюсь заменить строки, найденные в File1, строками в File2

Файл1

<IMG SRC="/Repository/GetImage.dll?baseHref=Orange/2011/03/27&amp;EntityID=Ad12911&amp;imgExtension=" />
<IMG SRC="/Repository/GetImage.dll?baseHref=Orange/2011/03/20&amp;EntityID=Ad13304&amp;imgExtension=" />
<IMG SRC="/Repository/GetImage.dll?baseHref=Orange/2010/08/29&amp;EntityID=Ad13724&amp;imgExtension=" />

Файл2

/getimage.dll?path=Orange/2011/03/27/129/Img/Ad1291103.gif
/getimage.dll?path=Orange/2011/03/20/133/Img/Ad1330402.gif
/getimage.dll?path=Orange/2010/08/29/137/Img/Ad1372408.gif

Когда я запускаю эту команду

$ sed -e 's/.*SRC="\/Repository\([^"]*\)".*/\1/p{r File1' -e 'd}' File2

Я получаю эту ошибку

sed: 1: "s/.*SRC="\/Repository\( ...": bad flag in substitute command: '{'

Что-то не так с моим регулярным выражением?

Результат, которого я пытаюсь добиться, будет выглядеть следующим образом:

Файл1

<IMG SRC="/Repository/getimage.dll?path=Orange/2011/03/27/129/Img/Ad1291103.gif" />
<IMG SRC="/Repository/getimage.dll?path=Orange/2011/03/20/133/Img/Ad1330402.gif" />
<IMG SRC="/Repository/getimage.dll?path=Orange/2010/08/29/137/Img/Ad1372408.gif" />

решение1

Если вы пытаетесь заменить File1все внутри двойных кавычек на новые имена изображений, взятые из File2awk, то я бы использовал:

awk -F'"' 'NR==FNR{a[i++]=$1;next}{print $1 FS a[j++] FS $3}' File2 File1

Вывод следующий:

<IMG SRC="/getimage.dll?path=Orange/2011/03/27/129/Img/Ad1291103.gif" />
<IMG SRC="/getimage.dll?path=Orange/2011/03/20/133/Img/Ad1330402.gif" />
<IMG SRC="/getimage.dll?path=Orange/2010/08/29/137/Img/Ad1372408.gif" />

решение2

Я понятия не имею, что вы пытаетесь там сделать, но мой sed-fu не так уж и силен, так что, полагаю, вы используете какой-то таинственный синтаксис, о котором я не знаю. Поскольку я не могу сказать вам, что не так с вашим sed (но обоснованное предположение заключается в том, что специальные символы, содержащиеся в ваших строках замены ( /и ?т. д.), вызывают проблемы), я вместо этого предложу альтернативу perl:

perl -i -pe 'BEGIN{open($f,shift); while(<$f>){chomp; push @F,$_}}
            $k=shift(@F); s/(.*SRC=.)([^"]*)/$1$k/' file2 file1 

Вот то же самое, написанное как закомментированный скрипт, чтобы было понятнее. В однострочном коде выше, вызывает -iизменение фактического входного файла, как и sed -i.

#!/usr/bin/env perl

## This is the equivalent of the BEGIN{} block.
## @ARGV is the array of arguments and shift returns
## the first element of it. This is file2 which is
## then opened, each line is read, its trailing \n
## is removed by chomp and it is then added to the @F array.
my $file=shift(@ARGV);
open($f,$file);
while(<$f>){chomp; push @F,$_}

## This is the rest of the oneliner above. The -pe options
## cause the file to be read and each line printed after 
## the script is applied. Since the previous block removed 
## file2 from @ARGV, this is applied to file1 only.
while (<>) {
    ## Remove the 1st item of @F. This is a line of file2.
    $k=shift(@F);

    ## Make the substitution. The \ before the " is not 
    ## needed, I just added it here because otherwise, the 
    ## syntax highlighting is broken. 
    s/(.*SRC=.)([^\"]*)/$1$k/;
    ## This print is implied by the -p flag
    print;
}

решение3

Ошибка говорит вам, что ваша команда sed неверна, а не ваше регулярное выражение. Вам нужна новая строка или точка с запятой, чтобы отделить sкоманду от следующей {команды. Эквивалентно, вы можете поместить их в отдельные -eаргументы.

sed -e 's/.SRC="/Репозиторий([^"])".*/\1/p' -e '{' -e 'r Файл1' -e 'd' -e '}' Файл2

Однако это не сделает то, что вам нужно. Он удаляет префикс …SRC="Repository/и часть, начинающуюся со следующей двойной кавычки из ввода, печатая только строки, которые были заменены (из-за pфлага в sкоманде и следующего d), и вставляет копию File1для каждой входной строки (совпадающей или нет).

Если вы хотите сопоставить данные из двух файлов, вам понадобится более мощный инструмент, чем sed¹.АвкилиПерлявляются хорошим выбором.

¹ Технически sed является полным по Тьюрингу, но сделать это в sed было бы чрезвычайно сложно и непонятно.

Связанный контент