2013-12-04 4 views
1

Я хотел бы использовать sed, чтобы найти что-то вроде #<file.sh>, и заменить эту строку на содержимое file.sh.базовая система требует с bash и sed: заменить содержимое файла

Ближайший я получил

echo "#<file.sh>" | sed "s/\#<\(.*\)>/\1/" 

И заменяет #<file.sh> для file.sh. Теперь я хотел бы заменить его на содержимое файла, а не на имя файла, которое я нашел.

Я пытался тогда

echo "#<file.sh>" | sed "s/\#<\(.*\)>/$(cat \1)/" 

Но в конечном итоге говоря cat: 1: inexisting file or directory, поэтому он пытается прочитать \ 1 вместо file.sh, который я сохранил в \ 1.

ответ

1

Если предположить, что у вас есть GNU sed, следующее может работать для вас:

sed '/#<\(.*\)>/s|.*|cat \1|e' filename 

Пример:

$ cat foo 
abc 
#</tmp/o/a.c> 
def 
$ cat /tmp/o/a.c 
#include <stdio.h> 

int main() { 
} 
$ sed 's|#<\(.*\)>|cat \1|e' foo 
abc 
#include <stdio.h> 

int main() { 
} 
def 
+0

Это не так. Это сработало для вас? –

+0

@ JoãoPintoJerónimo Да. Если вы используете 'GNU sed', это __should__. – devnull

+0

Я думаю, что должен быть, я в ubuntu box ... Я получил это: sed: -e выражение # 1, символ 24: ссылка \ 1 недействительна в RHS команды ' –

0

на основе @ devnull Ответим, попробуйте следующее:

sed '/\#<.*>/s|#<\(.*\)>|cat \1|e' filename 

В моей системе обратная ссылка должна находиться в поисковой части поиска и замены. Вам также необходимо избегать # <>, который вы собрали в начале.

Смежные вопросы