Ошибки сценария .sh

В этом случае вы можете использовать команду grep с поисковыми запросами Perl.

grep -oP '(?<=@TEST ).*(?=\" enabled=\"true\")' inputfile

Выражение «(? <=)» Отмечает точку, в которой совпадение начнется, а выражение «(? =)» - точку, в которой совпадение заканчивается.

". *" Указывает grep возвращать все, что находится между начальной и конечной точками.

При использовании тестового ввода строка выше возвращает 157 символов.

$ echo "Verify that the RADIUS accounting server should not send the Accounting-Response Message on Receiving the Accounting-Request Packet from the RADIUS Client" | wc -m
157

Если вы хотите дополнительно усечь это только до первых 50 символов, вы можете использовать cut

$ grep -oP '(?<=@TEST ).*(?=\" enabled=\"true\")' inputfile | cut -c1-50
Verify that the RADIUS accounting server should no

Если вы хотите сохранить результаты в файл, вам нужно перенаправить вывод в другой файл. Вы можете использовать что-то вроде следующего ...

$ grep -oP '(?<=@TEST ).*(?=\" enabled=\"true\")' inputfile | cut -c1-50 >> outputfile

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

Итак, если вам нужно сохранить все другие записи в файле и усечь только те строки, в которых enabled = "true", нам нужно изменить tools на awk.

$ awk  -F'@TEST' '{if (/true/) print substr($3,2,50); else print $0}' inputfile >> outputfile

Эта единственная строка будет выводить без изменений каждую строку, которая не соответствует истине. Если совпадает значение true, строка будет усечена до 50 символов. Опять же, я не рекомендую перезаписывать исходные данные, чтобы результаты передавались в выходной файл.

Основываясь на последних изменениях, внесенных в вопрос OP, я изменил однострочную версию awk, чтобы воспроизвести вывод, предоставленный Beginner. В своем комментарии он упомянул, что awk не работает. Пока OP не предоставит более подробную информацию о том, почему awk не работает, при использовании awk 4.1.3 в Ubuntu 16.04 следующая строка будет возвращать результаты, которые он подробно описал до сих пор.

awk  -F'@TEST' '{if (/true/) print "@TEST"$2,"@TEST",substr($3,2,50),"enabled=\"true\">"; else print $0}' inputfile >> outputfile
0
12.08.2015, 12:37
0 ответов

Теги

Похожие вопросы