2015-06-25 2 views
0

Я хотел бы заменить строку содержимым file.txt.Bash sed заменить текст содержимым файла

mtn="John" 
fs=`cat file.txt` 
lgtxt=`cat large_text.txt` 

stxt1=`echo $lgtxt | sed "s/zzzz/$mtn/g"` 
stxt2=`echo $stxt1 | sed "s/pppp/$fs/g"` 

Он заменяет «zzzz» на значение «mnt», но не «pppp». Файл file.txt содержит список имен, например: Tom jones Ted Baker Linda Evans в отдельных строках. Я хочу поместить их в файл large_text.txt в отдельных строках, как они находятся в оригиналированном файле и разделены запятыми.

+0

'm4 (1)' ваш друг. – lcd047

+0

Выполняет ли pppp только один раз на отдельной строке? В этом случае мы можем искать другое решение, разделяющее lgtxt на pppp-линию. Или pppp происходит на некоторых строках 'if [" $ {line} "=" pppp "]; затем ... ' –

+0

Это не происходит в предложении и не только один раз. –

ответ

7

Вы не хотите использовать переменную для подстановки (потому что она может содержать символы новой строки, например). Я предполагаю, что это GNU sed, это . В этом случае см, может ли GNU СЕПГ команда r поможет вам:

`r FILENAME' 
    As a GNU extension, this command accepts two addresses. 

    Queue the contents of FILENAME to be read and inserted into the 
    output stream at the end of the current cycle, or when the next 
    input line is read. Note that if FILENAME cannot be read, it is 
    treated as if it were an empty file, without any error indication. 

    As a GNU `sed' extension, the special value `/dev/stdin' is 
    supported for the file name, which reads the contents of the 
    standard input. 

Если pppp находится на линии своей собственной, вы могли бы пойти с чем-то вроде

/pppp/{ 
r file.txt 
d 
} 

или, в качестве альтернативы, команда s с модификатором e:

`e' 
    This command allows one to pipe input from a shell command into 
    pattern space. If a substitution was made, the command that is 
    found in pattern space is executed and pattern space is replaced 
    with its output. A trailing newline is suppressed; results are 
    undefined if the command to be executed contains a NUL character. 
    This is a GNU `sed' extension. 

Это будет выглядеть примерно так

s/pppp/cat file.txt/e 

и это то, что вам нужно, если pppp в середине строки. Кроме того, если вам нужна дальнейшая обработка на file.txt, вы можете заменить cat на все, что вам нужно (хотя вам нужно быть осторожным при цитировании / и \).

Окончательный вариант - рассмотреть Perl, который примет нечто очень похожее на ваши команды оболочки.

+0

'code' sed -i '/ pppp/r file.txt' large_text.txt' code' почти решил проблему ;-). для получения идеального результата мне нужно удалить «pppp» после замены. Как насчет такой же ситуации, но заменяемый текст нужно разделять запятыми? –

+0

@Marcin: Я отредактировал, чтобы ответить на ваш комментарий. –