Как удалить word из строки в сценарии оболочки

#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
  

Предполагается, что заголовки состоят из одного слова каждый (без пробелов).