Есть папка с файлами . В каждом файле есть данные в виде:
------------------------------------------------------------------------------------------------------------------
HOLE = KZK_249 /*
PROJECT = Yark_wdb_int@pnsmos5 /*
DEPTH_BOTTOM = - /* Downhole depth (METRES) DOUBLE
DRILLED_DEPTH = - /* Total Depth - Driller (METRES) DOUBLE
ELEV_MEAS_REF = 181.43 /* Elevation of Measurement Reference (METRES) DOUBLE
FIELD = Jarkeevsky /* Field
LOCATION = Kjizjil-Kjychevskaja /* Location
LOGGED_DEPTH = - /* Total Depth - Logger (METRES) DOUBLE
SYMBOL = CIRCLE /* Symbol
TVD_BOTTOM = - /* True Vertical Depth at well bottom (METRES) DOUBLE
TYPE = SPM /*
WELL_BASH = 249KZK /* Primary Well Identifier
--------------------------------------------------------------------------------------------------------------------
Нужно подменить значение в строчке HOLE = KZK_249 /* от знака равно до слэша, на значение из строчки WELL_BASH = 249KZK /* Primary Well Identifier от знака равно до слэша. Причем в каждом файле значения разные. А их 1000 шт.
Прошу выручайте . *SORRY*
Интересный вопрос. Было бы тоже интересно узнать, как это делается...ждём железобетонного суперадминистратора всех Linux-Вселенных, мегагуру bash-scripting'a drBatty.
Интересный вопрос. Было бы тоже интересно узнать, как это делается...ждём железобетонного суперадминистратора всех Linux-Вселенных, мегагуру bash-scripting'a drBatty.
Это 5 *ROFL*
Но при этом согласен, drBatty это толковый специалист.
тут правда с учётом того что вид у HOLE всегда типа
HOLE = [a-Z]*_[0-9]* ну с этим можно поиграться...
Теперь вопрос как прореплейсить файлы если это необходимо=)
for i in `ls -1`;do b=`grep WELL_BASH $i|awk '{print $3}'`; a=`grep HOLE $i|awk '{print $3}'`;sed 's/'$a'/'$b'/g' $i;done
как же иногда хочется ходить по улицам и убивать людей, которые в одной строке мешают sed, grep и awk... хорошо хоть тут tr и cut не понадобились... =)
наиболее разумное решение, ИМХО:
text
find -type f | while read f; do
well_bash=$(sed -rne 's!^WELL_BASH\s=\s(.+)\s/\*.*$!\1!p' $f)
sed -re 's!^(HOLE\s=\s).+(\s/\*.*)$!\1'"$well_bash"'\2!' -i $f
done
ради спортивного интереса, одним sed скриптом:
text
sed -nre 'H;/WELL_BASH/{x;s!(HOLE\s*=\s*)([^\n]+)(\s*/\*[^\n]*\n.*\nWELL_BASH\s*=\s*)([^\n]+)(\s*/\*[^\n]*\n)!\1\4\3\4\5!;p}' <file>
само собой, у каждого способа есть свои недостатки...
borisgorbunov,
как-то так:
[console]$ sed -rn 'H;${x;s~(HOLE =)([^/]*)(.*)(WELL_BASH =)([^/]*)~\1\5\3\4\5~;s/\n//;p}' f
HOLE = 249KZK /*
PROJECT = Yark_wdb_int@pnsmos5 /*
DEPTH_BOTTOM = - /* Downhole depth (METRES) DOUBLE
DRILLED_DEPTH = - /* Total Depth - Driller (METRES) DOUBLE
ELEV_MEAS_REF = 181.43 /* Elevation of Measurement Reference (METRES) DOUBLE
FIELD = Jarkeevsky /* Field
LOCATION = Kjizjil-Kjychevskaja /* Location
LOGGED_DEPTH = - /* Total Depth - Logger (METRES) DOUBLE
SYMBOL = CIRCLE /* Symbol
TVD_BOTTOM = - /* True Vertical Depth at well bottom (METRES) DOUBLE
TYPE = SPM /*
WELL_BASH = 249KZK /* Primary Well Identifier
[/console]
это в предположении, что WELL_BASH всегда идёт ПОСЛЕ HOLE.
Если ДО, то проще.