LINUX.ORG.RU

снова про SED


0

0

Столкнулся с такой заморочкой, может ктонибудь подскажет?
можно ли посредством sed'а вырезать из строки определенное выражение и запихнуть его в другой файл?
т.е. есть файл со строкой "begin, text, ABCD, end", и хочется, чтобы в этом файле осталось "begin, text, end", и создался файл со строкой "ABCD".
как решить задачу?

awk может

echo 'begin, text, ABCD, end' | awk -vr='ABCD' '{gsub(r", ", "", $0); print > r}'

cat ABCD

sdio ★★★★★
()

Если нужно вырезать не ABCD, а третье поле в строке, то еще проще

awk -F','  '{print $1", "$2", "$4 > $3}

sdio ★★★★★
()
Ответ на: комментарий от anonymous2

тоесть средствами самого SEDа это не сделать?
нельзя засунуть часть строки в HOLD и поменяв местами hold и space вывести это в файл?

elfrock
() автор топика
Ответ на: комментарий от elfrock

echo "begin, text, ABCD, end" |sed -r '/(.*)(ABCD)(.*)/ {s//\2\n\1\3/;W a'$'\12''D}'

< a : ABCD

только, имхо, это немного извращение... я бы выбрал perl -lape

n01r ★★
()
Ответ на: комментарий от n01r

зы... $'\12' лишь для однострочности... правильнее, вероятно, будет записать sed-скрипт в >1 строк

n01r ★★
()
Ответ на: комментарий от n01r

Спасибо! вроде работает, потестируем :)
но я нигде не встречал такого..расскажите пожалуйста, что такое
как работает строка подмены?
что такое '$'\12' ?

elfrock
() автор топика
Ответ на: комментарий от elfrock

> как работает строка подмены?

/<pattern>/ s//<new>/ - эквивалент для "s/<pattern>/<new>/" только в первом случае удобнее выносить regexp вне блока {}

W и D - в мане =)

про $'\12' упомянул... это embedded new line, то есть для однострочности вместо:

...W <smth> D...

n01r ★★
()
Ответ на: комментарий от n01r

Да кроме $'\12' какраз то все понятно :)
w и d темболее )
мм.. а почему 12 ? чтото не понимаю всеравно? это символ newline?
посмотрел, вроде в utf другой номер..
еще странно, но после добавления этой строки, скрипт в целом затормозился раза в 2.5 ...

elfrock
() автор топика
Ответ на: комментарий от elfrock

> мм.. а почему 12 ? чтото не понимаю всеравно? это символ newline?

man bash:

Words of the form $'string' are treated specially.

<skipped>

\nnn the eight-bit character whose value is the octal value nnn (one to three digits)

> еще странно, но после добавления этой строки, скрипт в целом затормозился раза в 2.5 ...

хз... однострочность обычно подразумевает одноразовость а также отсутствие особой необходимости в производительности

если про скрипт вообще (в котором есть команда sed), то лучше переписать (как, тебе виднее) или можно попробовать awk/perl

n01r ★★
()
Ответ на: комментарий от n01r

Спасибо за объяснение :) теперь все понятно
единственное - только щас заметил, что если в строке несколько вхождений вида ABCD (там на самом деле приходится вырезать от AB до CD)
то, вопщем запись в файл идет с конца строки в начало
не знаете как это можно подправить?

я бы попробывал perl или awk, но я не программер :) не умею я этого)
мне показалось что обрабатывать здоровый (около 4х гигов) текстовый файл лучше sed'ом :)
если не так, не подскажете, чем лучше всего это делать?
есть большой xml, из в нем надо много всего преобразовать, с СЕД я уже несколько подзапарился выдумывать регулярки..
чем обычно это делают?

elfrock
() автор топика
Ответ на: комментарий от elfrock

> мне показалось что обрабатывать здоровый (около 4х гигов) текстовый файл лучше sed'ом :)

perl по-моему опыту (не очень, правда, большому) был бы в этом случае предпочтительнее, напр:

test.pl:


#!/usr/bin/perl -ln

open(FD, '>>', "/tmp/out");

if (/(.*)(ABCD), (.*)/) {
print $1, $3;
print FD scalar reverse $2;
}

close FD


echo "begin, text, ABCD, end" | ./test.pl


m perlfunc - для поиска нужных строковых функций, m perlrun - опции (-ln можно добавить -i чтобы ABCD удалялось из исходного файла, короче, лучше потестить), regexp - очень похож...

> вопщем запись в файл идет с конца строки в начало


не очень понятно, поэтому лишь "reverse")

n01r ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.