2014-02-13 4 views
1

Мне нужна помощь в обработке сценариев оболочки. Скрипт должен прочитать каждый файл в пути и заменить строку в каждой строке.Сценарий оболочки Sed опция

Он должен прочитать каждую строку и заменить 7-ю колонку на XXXX, указанную в образце. Любая помощь в оценке.

входного файла данных

"2013-04-30"|"X"|"0000628"|"15000231"|"1999-12-05"|"ST"|"2455525445552000"|"1111-11-11"|75.00|"XXE11111"|"224425" 
"2013-04-30"|"Y"|"0000928"|"95000232"|"1999-12-05"|"VT"|"2455525445552000"|"1111-11-11"|95.00|"VVE11111"|"224425" 

выходного файла

"2013-04-30"|"X"|"0000628"|"15000231"|"1999-12-05"|"ST"|"24555XXXXXXXXXX"|"1111-11-11"|75.00|"XXE11111"|"224425" 
"2013-04-30"|"Y"|"0000928"|"95000232"|"1999-12-05"|"VT"|"24555XXXXXXXXXX"|"1111-11-11"|95.00|"VVE11111"|"224425" 

Script я использовал для запуска, но не редактирование входного файла

FILES=/home/auto/*.txt 
for f in $FILES 
do 
echo "Processing $f file..." 
cat $f | awk 'BEGIN {FS="|"; OFS="|"} {$7=substr($7, 1, 6)"XXXXXXXXXX\"";print}' 
done 

но не может редактировать выход из файла в каталог. Мне нужно использовать опцию sed -i, но она не работает.


Я пробовал использовать скрипт на сервере ниже, но я получаю следующую ошибку.

SunOS 5.10  Generic January 2005 
echo "hello" 

FILES=/export/home/*.txt 
for f in $FILES 
do 
echo "Processing $f file..." 
sed -i -r 's/"([^"]{6})[^"]*"/"\1XXXXXXXXXX"/6' "$f" 
done 

Я получаю

sed: illegal option -- i 
+0

С помощью «sed» Solaris вам придется перенаправить вывод во временный файл, а затем скопировать или переместите временный файл поверх оригинала. Вы можете или не можете найти, что он поддерживает параметр '-r'; IIRC, это не так. В этом случае вам нужно будет использовать '\ (... \)' для группировки и '\ {n, m \}' для подсчета групп. –

ответ

1

если ваш AWK является гну AWK 4.1.0, есть in-place вариант, прочитать человек/информационную страницу. в противном случае, вы могли бы сделать:

awk '..code..' inputfile > tmpfile && mv tmpfile inputfile 

внимание, что cat не является необходимым, может (должно) быть удалены.

+1

Указатель 'gawk 4.1 +' полезен, но (а) его имя 'inplace' и (b) это * расширение *, а не опция; ни «человек», ни «информация» не содержат информации об этом; демонстрацию можно найти по адресу http://stackoverflow.com/a/16529730/45375 и дополнительную информацию в онлайн-руководстве по адресу http://www.gnu.org/software/gawk/manual/gawk.html#Extension-Sample -На месте. – mklement0

+0

@ mklement0 да, это 'inplace', и на моей странице gawk есть объяснения и примеры. info gawk и поиск 'inplace', вы найдете – Kent

+0

Interesting; похоже, что некоторые дистрибутивы (например, Ubuntu) просто показывают вам содержимое страницы 'man', когда вы делаете' info gawk' - где информация 'inplace' - _not_ present. – mklement0

1

Немного некрасиво, но вы можете попробовать что-то подобное с sed

sed -i 's/\(\([^|]*|\)\{6\}\)\(.\{6\}\).\{11\}\(.*\)/\1\3XXXXXXXXXXX\4/' file 

Так с существующим сценарием, это будет -

FILES=/home/auto/*.txt 
for f in $FILES 
do 
    echo "Processing $f file..." 
    sed -i 's/\(\([^|]*|\)\{6\}\)\(.\{6\}\).\{11\}\(.*\)/\1\3XXXXXXXXXXX\4/' "$f" 
done 
+0

Jay-Nice Я могу видеть результат, но вы можете объяснить, так что если мне нужно изменить первую 7-значную цифру вместо 5 цифр, я смогу это сделать позже.что такое 6, 6, 11,1,3XXX и т. д. – Sen

+0

Цифры представляют точное соответствие, которое вы хотите сохранить. Я предполагаю, что вы хотите сказать, что сохраните первые 7 цифр вместо 5, затем измените второй '\ {6 \}' на '\ {8 \}' и замените 3 X на замену. –

2

Использования GNU СЭД с -i optoin

sed -i -r 's/"([^"]{5})[^"]*"/"\1XXXXXXXXXX"/5' file 


"2013-04-30"|"X"|"0000628"|"15000231"|"1999-12-05"|"ST"|"24555XXXXXXXXXX"|"1111-11-11"|75.00|"XXE11111"|"224425" 
"2013-04-30"|"Y"|"0000928"|"95000232"|"1999-12-05"|"VT"|"24555XXXXXXXXXX"|"1111-11-11"|95.00|"VVE11111"|"224425" 
+2

Красиво сделано; вы пропускаете два символа 'X'. Пользователи OSX: используйте 'sed -i '' -E' вместо' sed -i -r'. – mklement0

+0

Приятное обнаружение, спасибо, я обновил. Но у меня нет системы OSX, чтобы проверить ее предложение в OSX sed. :-( – BMW

+0

Спасибо, не стоит беспокоиться о ОС OSX - неясно, какая платформа использует OP, иногда я добавляю информацию OSX, чтобы пользователи OSX могли извлечь выгоду из ответов - часто это всего лишь незначительная вещь, например, разные имена опций. – mklement0

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