#bash #shell #awk #sed
#bash #оболочка #awk #sed
Вопрос:
Я хочу удалить определенное слово из строки в сценарии оболочки.
Мой текстовый файл содержит следующие данные
***** Failed tests *****
Devices Class Test
Nexus_5_29_2(AVD) - 10 Addition productCalculation
Я хочу удалить Devices
и Nexus_5_29_2(AVD) - 10
Nexus_5_29_2(AVD) - 10
не является постоянным, оно может измениться на Nexus_5_29_1(AVD) - 10
или Nexus_5_29(AVD) - 10
Ожидаемый результат
***** Failed tests *****
Class Test
Addition productCalculation
как я могу этого добиться? awk
предпочтительнее
Комментарии:
1. Добро пожаловать в Stack Overflow. SO — страница вопросов и ответов для профессиональных программистов-энтузиастов. Пожалуйста, добавьте свой собственный код к вашему вопросу. Ожидается, что вы продемонстрируете, по крайней мере, объем исследований, которые вы провели для самостоятельного решения этого вопроса.
2. @ProBot : Итак, вы хотите удалить первые n символов из каждой строки?
3. @Cyrus я новичок в shell script. я проанализировал эти данные из html- документа , используя html2text . неважно, как я увяз в этом. я попытался с помощью awk удалить имя устройства. но не удалось удалить (AVD) — 10
4. @user1934428 ожидаемый результат упоминается в вопросе. не может указать номер, поскольку эти данные поступают из html-отчета
5. Подумайте о том, чтобы вернуться к исходному HTML-коду и использовать анализатор HTML для генерации конечного результата, который вы хотите, вместо этого промежуточного формата.
Ответ №1:
Используйте sed для замены или поиска и удаления
sed -i -e 's/Devices//g' filename.txt
Решение Awk:
cat filename.txt | awk '{print $2 $3 }'
Чтобы сделать так, как вы хотите, мне нужно больше информации.
Комментарии:
1. awk не будет работать, если разделителем полей не является табуляция, а не пробел, и если вы укажете его как таковой. Не хватает запятой. Также UUOC.
Ответ №2:
Это может сработать для вас (GNU sed):
sed -E '/^Devices/{N;s/^S s (.*n)Nexus_5_29(_[0-9] )?(AVD) - 10s /1/};P;D' file
Если строка начинается Devices
, добавьте следующую строку и удалите первый столбец и связанные с ним пробелы из этих двух строк, если вторая строка соответствует требуемой строке.
Примечание. Добавленная строка может не соответствовать критериям для второй строки, в этом случае первая строка должна быть напечатана как обычно, и процесс повторяется со второй строкой, занимающей ее место, отсюда причина для команд P
и D
. Все остальные строки будут напечатаны как обычно.
Исходя из описанных вами критериев, приведенного выше решения вполне может быть достаточно. Однако, возможно, требуется более общее решение?:
sed -E '/^Devices/{N;s/^S s (.*n)w _[0-9] _[0-9] (_[0-9] )?([A-Z]{3}) - [0-9] s /1/};P;D' file
Ответ №3:
Предполагая, что в вашем файле есть только пробелы и нет табуляций, вы можете удалить первые n символов для строк, за исключением заголовка.
> awk 'NR>1 {$0=substr($0,26)} 1' file
***** Failed tests *****
Class Test
Addition productCalculation
Ответ №4:
найдите положение второго заголовка во второй строке и обрежьте левую часть.
$ awk 'NR==2{n=match($0,/ [^ ]/)} {print substr($0,n 1)}' file
***** Failed tests *****
Class Test
Addition productCalculation
Предполагается, что заголовки состоят из одного слова каждый (без пробелов).