2013-07-02 3 views
1

В настоящее время файл a.txt имеет:сценарий оболочки: вставить новую строку в файл, используя СЭД

#define ABC 

Я хочу изменить a.txt на:

#define ABC 
#define DEF 

И я пытался

sed 's/#define ABC/#define ABC&\n#define DEF/g' a.txt > tmp/test.txt 
mv tmp/test.txt > a.txt 

, но это дает мне #define ABC#define ABCn#define EDF вместо этого. Попробовал несколько решений онлайн, но он не работает. Что не так с моим решением? Благодаря!!!

Работа на Solaris 11

+1

http://stackoverflow.com/a/16246806/632407 – jm666

+0

@ jm666 Я не вижу, как это ответили на мой вопрос. Поверьте мне, когда я сказал, что уже пробовал много решений и не мог заставить его работать. Это было ближе всего к моему делу: http://stackoverflow.com/questions/682984/shell-adding-a-new-line-between-a-given-line-of-text, и это не помогло мне, возможно, потому что У меня есть или что-то, я не знаю. –

+1

Почему бы не добавить строку? 'echo '#define DEF' >> a.txt' – potong

ответ

3

Попробуйте что-то вроде:

$ echo '#define ABC' | sed '/ABC$/ a\ 
> #define DEF' 
#define ABC 
#define DEF 

Примечание: Проверено на Oracle Solaris 10 9/10 s10s_u9wos_14a SPARC

+0

Спасибо! Это работает.Я по существу сделал что-то похожее на ваше решение, чтобы заставить его отредактировать мой файл: 'sed 's/# define ABC/# define ABC \ > #define DEF /' a.txt> new.txt' –

+0

@DaoLam You Добро пожаловать. Рад, что это сработало. :) –

1

Второй пример по цитируемой ссылке является решением для вас

< a.txt sed "/ABC$/a \\ 
#define DEF 
" 

будет производить из a.txt

#define ABC 

выход

#define ABC 
#define DEF 

Или 5-й пример из вышеуказанной ссылки

< a.txt sed "/ABC$/s/$/\\ 
#define DEF/" 

так, ЧИТАЙТЕ!

+0

Не могли бы вы объяснить? Я пробовал в обоих направлениях, и они не работали. a.txt остается неизменным. –

+0

Уход за спусковым механизмом подскажите, что не так с кодом? оба примера добавляют желаемую строку к выходу. – jm666

2

Код для GNU :


 
$echo #define ABC|sed 's/.*/&\n#define DEF/' 
#define ABC 
#define DEF 
+0

Спасибо за ответ. Я использую sed на Solaris, поэтому приведенная выше команда ничего мне не вернула. Есть идеи? –

2

ничего, кроме ваш '&' был проблема.

попробовать это

sed 's/#define ABC/#define ABC \n#define DEF/g' a.txt 

#define ABC 
#define DEF 

Я проверил в моей коробке Unix и это работает прекрасно

Так ваше окончательное решение должно быть, как это

sed 's/#define ABC/#define ABC \n#define DEF/g' a.txt 
a.txt > tmp/test.txt 
mv tmp/test.txt > a.txt 
+0

Спасибо. Я пробовал то же самое раньше, но это не сработало. В конце концов, я понял, что это потому, что я использовал bash для Solaris. По-видимому, вышеупомянутый код работает для bash на Linux, но не для Solaris. То же, что и для sed \ a (добавить). Спасибо, однако, ваше решение должно работать, если я был в Linux. –

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