2013-11-27 5 views
0

У меня есть несколько строк в файле, как этиКак сохранить часть строки при использовании SED?

APPLE JUICE 
APPLE JAM 
APPLE JELLY 

Я хочу, чтобы заменить «ЯБЛОКА» с «АПЕЛЬСИН» и добавить «МАГАЗИН» до конца строки. Выходной сигнал будет

ORANGE JUICE SHOP 
ORANGE JAM SHOP 
ORANGE JELLY SHOP 

Как это сделать в sed или vim?

EDIT1: Я нашел решение, которое работает в SED

#replace APPLE with ORANGE 
sed -i s/APPLE/ORANGE/g foo.txt 
#in a line containing ORANGE replace newline with SHOP 
sed -i '/ORANGE/s/$/ SHOP/g' 

Сейчас проблема заключается в том, что я не могу получить вторую команду для работы в Vim. Итак, теперь это вопрос vim.

+0

Что вы пробовали? Это довольно просто ... Вам понадобится команда 's' для замены текста. – twalberg

ответ

0

здесь вы идете:

kent$ echo "APPLE JUICE 
APPLE JAM 
APPLE JELLY"|sed 's/\bAPPLE\b/ORANGE/;s/$/ SHOP/' 
ORANGE JUICE SHOP 
ORANGE JAM SHOP 
ORANGE JELLY SHOP 

я добавил границу слова, так что-то вроде PINEAPPLE не будет заменен PINEORANGE

в Vim, с той же идеей:

%s/\<APPLE\>/ORANGE/|%s/$/ SHOP/ 

EDIT

, когда я отправил ответ, нет требования, чтобы добавление SHOP было только в случае совпадения ORANGE. ОП обновил вопрос после моего ответа.

в любом случае, я добавил еще ВИМ ЦМД:

%s/\<APPLE\>/ORANGE/g|%s/.*\<ORANGE\>.*/& SHOP/ 
+1

Удивительно, что вы ответили, но мы должны поощрять пользователей попробовать что-то самостоятельно, а затем приходить сюда с проблемами, а не спрашивать их, не пытаясь. (Я уверен, что это обсуждаемая здесь тема или мета, только мой 2 ¢) – Siddhartha

+0

Спасибо! Решение vim - это то, что мне нужно. Еще раз спасибо! – user2708149

+0

@ Сиддхартха Что он должен делать, добавьте еще один комментарий «что вы пробовали?». –

2

Нет, @ ответ Elide строки Кента не содержащие APPLE и добавить SHOP ко всем строкам в файле. Вы должны использовать RE подвыражения:

echo "APPLE JUICE\ 
CHERRY JAM\ 
APPLE JELLY" | sed 's/^APPLE \(.*\)$/ORANGE \1 SHOP/' 
ORANGE JUICE SHOP 
CHERRY JAM 
ORANGE JELLY SHOP 
+0

, когда я ответил на вопрос, нет требования о том, чтобы добавить МАГАЗИН только в том случае, если был «APPLE». также новым требованием является добавление SHOP для ORANGE. :) – Kent

2

В Vim сам попробовать это в режиме командной

: (. * \)% S/APPLE \/ORANGE \ 1 МАГАЗИН/г

+0

Если исходная строка имеет «ORANGE», но без «APPLE», эта команда не добавит 'SHOP' в эту строку. '# в строке, содержащей ORANGE, заменить новую строку SHOP' – Kent

0

@dyomas прав, что ответ Kent без разбора добавляет SHOP в все строк.

Вот решение, которое не использует подвыражения; вместо этого он использует команду t, которая проверяет подстановки и только затем добавляет SHOP.

sed 's/\bAPPLE\b/ORANGE/; t append; b; :append s/$/ SHOP/' 

Поскольку команда t скачки в случае замены (но нам нужно наоборот), мы должны прыгать «над» в b команды, в противном случае прекращает обработку строки.

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