2016-08-16 3 views
1

Я пытаюсь grep строка из файла, а затем из $ 1 Я пытаюсь изменить символ. напримерGrep и заменить символ из результата grepped

cat file1.txt 
Surjit 
Shilpa 
cchiku 
end of file 

Я попробовал и grepped линию, которая начала с с.

grep -e "S" 

Тогда я хочу, чтобы заменить 4-й символ х для всех grepped результат в file1.txt

Я попытался

sed -i "s/./x/4" file1.txt 

Как я могу сделать это только для grepped результатов?

ответ

3

Вы можете использовать sed '/pattern/s/find/replace/' file синтаксис:

sed '/^S/s/./x/4' file 
#  ^^ ^^^^^^^ 
#  | replace the 4th character with x 
#  | 
#  on lines starting with S 

С файла:

$ sed '/^S/s/./x/4' file 
Surxit 
Shixpa 
cchiku 
end of file 

Примечание Я использую /^S/ как шаблон, чтобы соответствовать линии начиная с S, потому что если вы только что скажем, /S/ соответствует любой строке , содержащей S. Якорь ^ указывает начало линии.

+0

Это работает. Если я использую шаблон и grepping некоторые $ 1 от линии, то это будет работать? Я не могу использовать grep -e "regxp" | sed something – Raj

+0

@Raj, конечно, просто скажите 'sed '/$1/s/./x/4« файл »или поместите его в var' var = $ 1', а затем 'sed' /$var/s/ ./ x/4 "file' – fedorqui

+1

И, конечно же, вы можете избежать ненужного использования' grep', используя что-то вроде 'sed -n -e '/^S/s /./ x/4p'' для печати только строк которые соответствовали исходной схеме. – ghoti

2

Альтернатива fedorqui's answer должна включать начиная с S состояния в самой схеме:

sed 's/^\(S..\)./\1x/' file 

Команда совпадения линий, начиная с S и помещает S и следующие два символа в согласующей группе , В заменяемой части содержимое группы соответствия будет повторно использоваться и следующий символ после того, как он будет заменен на x.

+0

Хороший! Мне любопытно, и что лучше всего внутренне: выполнять поиск по отдельности, а затем заменять (как я) или сопоставлять в соответствующей части так же, как и вы. – fedorqui

+0

Я предполагаю, что это зависит от входных данных, но давайте короткую попытку! :) .... минут ... – hek2mgl

+1

@fedorqui Я только что сделал короткий тест: кота выше входного файла с собой, пока у нас нет файла с 200 миллионами строк. Ваше решение заняло 1:59 минуты, мне потребовалось 1:17 минут. На самом деле это имеет смысл. – hek2mgl

2
awk -v FS="" -v OFS="" '/^S/{$4="x"}1' infile 
Surxit 
Shixpa 
cchiku 
end of file 
Смежные вопросы