Используйте sed для удаления символов перед совпадающими ключевыми словами

Если это должно быть awk, просто сделайте:

awk -- '/AAA/,/BBB/{print}'

Но кажется, что sed идеально подойдет и для вашего случая. Итак, аналогично просто делаем:

sed -ne '/AAA/,/BBB/p'

В обеих командах используйте запятую, чтобы указать, что вы хотите рассмотреть все строки, начиная с (и включая )строку, соответствующую первому шаблону, до (и включая )строку, соответствующую первому шаблону. второй узор.

0
25.09.2020, 04:09
4 ответа

Очень простой подход заключается в следующем:

$ sed 's,.........DOWNLOAD</DIV>, DOWNLOAD</DIV>,g' input.txt
<DIV>SOFTWARE V1.0.1.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.2.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.3.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.4.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.5.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>

Это заменяет 9 символов перед DOWNLOAD</DIV>и заменяет его на DOWNLOAD</DIV>

4
18.03.2021, 23:02

С sed, у которого есть -Eдля включения ERE (, например. GNU sed и BSD/OSX sed):

sed -E 's:.{8}( DOWNLOAD</DIV>):\1:' file

иначе с любым POSIX sed:

sed 's:.\{8\}\( DOWNLOAD</DIV>\):\1:' file

напр.

$ sed -E 's:.{8}( DOWNLOAD</DIV>):\1:' file
<DIV>SOFTWARE V1.0.1.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.2.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.3.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.4.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.5.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>

$ sed 's:.\{8\}\( DOWNLOAD</DIV>\):\1:' file
<DIV>SOFTWARE V1.0.1.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.2.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.3.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.4.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.5.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
2
18.03.2021, 23:02

Вы можете попробовать это:

sed 's#SOFTWARE \(.*\)\.[A-Z]\{7\} DOWNLOAD#SOFTWARE \1 DOWNLOAD#' file
1
18.03.2021, 23:02

Использование Раку (урожденная Perl6)

~$ raku -pe 's/ <(. ** 8)> <?before " DOWNLOAD</DIV>" $$ >  //;' download.txt
<DIV>SOFTWARE V1.0.1.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.2.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.3.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.4.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>
<DIV>SOFTWARE V1.0.5.0 DOWNLOAD</DIV>
<DIV>...</DIV>
<DIV>...</DIV>

В приведенном выше коде используется флаг автопечати -peв сочетании с оператором подстановки s///. Внутри левой -половины оператора s///для поиска закрывающего тега DOWNLOAD</DIV>используется утверждение нулевой -ширины, а предыдущие 8 символов точно захватываются (и удаляются )с помощью <(. ** 8)>код.

ХТН.

https://raku.org
https://docs.raku.org/language/regexes

1
18.03.2021, 23:02

Теги

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