2014-10-21 6 views
0

Как заменить два символа, 5-й и 6-й цифры в строке ниже?Заменить символ в строке в bash

2xxx99xx 

Я хочу заменить 5-ю и 6-ю цифру (что равно 99), получив количество записей в файле.

$cat file | wc -l 
3 

Выход должен быть:

2xxx03xx 
+1

могло бы быть сделано с [ 'sed'] (http://man7.org/linux/man-pages/ man1/sed.1.html) или ['awk'] (http://man7.org/linux/man-pages/man1/gawk.1.html) или многие другие программы. Возможно, вы захотите попробовать себя в первую очередь и рассказать нам, что * вы пробовали и как это произошло. –

+1

'wc -l <файл' предпочтительнее' cat file | wc -l'. – chepner

+0

@Joachim Pileborg, я пробовал это ** record_count = 'wc -l <$ FILE' FOO = 2xxx03xx awk -v rec =" $ {record_count} "'{data = substr ($ 0, 5, 6); Данные = ЗАП; print} '**, но с FOO ничего не меняется. Извините, я новичок в этом. – MJM

ответ

3
foo=2xxx99xx 
printf "%s%02d%s" ${foo:0:4} $(wc -l < file) ${foo:6} 
+0

@shellter: действительно, спасибо. Я обновил свой ответ. –

+0

Я получил эту ошибку $ {trailer: 0: 4}: Указанная подстановка недопустима для этой команды. Обратите внимание, что ** trailer = $ (tail -n 1 $ FILES) ** – MJM

+0

Что делает 'tail -n 1 $ FILES' для печати? –

0

С СЕПГ:

echo "2xxx99xx" | sed -r "s/(.{4})..(.*)/\1$(printf "%02d" `wc -l < ff`)\2/g" 

первые 4 символа образуют группу 1, остальная часть строки, за исключением 5 и 6 символов образуют группу 2. Затем мы возвращаем 1-ю группу, форматированные данные, затем вторую группу.

Если СЭД версия не поддерживает расширенное регулярное выражение, используйте следующую команду:

echo "2xxx99xx" | sed "s/\(.\{4\}\)..\(.*\)/\1$(printf "%02d" `wc -l < ff`)\2/g" 
+0

получил эту ошибку ** sed: незаконный вариант - r ** – MJM

+0

Как получить 4-значный счетчик записей. Например, я получил ** 4567 ** количество записей, как я могу получить ** 2x4567xx **? – MJM

+0

Каковы другие возможности? если у вас есть 45678, вам нужен вывод 245678xx ?. если у вас есть 456789, вам нужен выход для 456789xx? –

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