gsub: удалить до первого появления вместо последнего появления данного символа в строке

У меня есть html-файл, из которого я в основном пытаюсь удалить первые появления <...> с участием sub/ gsub функциональные возможности.

Я использовал регулярное выражение awk . * + в соответствии с чем-либо между <. Однако первое появление >сбегает (?). Я не знаю, есть ли обходной путь.

входной образец file.txt ( xдобавлено, чтобы не печатать пустым) :

      <div>fruit</div></td>x
<span>banana</span>x
<br/>apple</td>x

код :

      awk '{gsub(/^<.*>/,""); print}' file.txt

текущий выход:

      x
x
x

желаемый результат:

      fruit</div></td>x
banana</span>x
apple</td>x

2 ответа

Решение

С вашими показанными образцами попробуйте следующий код. Простое объяснение было бы, используя subЗаменить функцию программирования. Затем заменив начало до (используя [^>] означает до первого появления), включая NULL в текущей строке, наконец, напечатать отредактированную / неотредактированную строку с помощью 1.

      awk '{sub(/^<[^>]*>/,"")} 1' Input_file


2-е решение: Использование match функция awk здесь соответствуют значениям от 1-го до 1-го появления > и распечатайте оставшуюся часть строки.

      awk 'match($0,/^<[^>]*>/){print substr($0,RSTART+RLENGTH)}' Input_file

ИЛИ Если у вас есть строки, которые не начинаются с < и вы хотите их распечатать, затем используйте следующее:

      awk 'match($0,/^<[^>]*>/){print substr($0,RSTART+RLENGTH);next} 1' Input_file

Однако при первом появлении происходит экранирование (?).

Нет, вы получили результат, потому что в GNU, как сказано в руководстве

awk(...) регулярным выражениям всегда соответствует самая левая, самая длинная последовательность входных символов, которая может соответствовать

это называется жадным в использовании регулярных выражений в других языках, например, для

      <div>fruit</div></td>x

/^<.*>/ совпадает

      <div>fruit</div></td>

таким образом вы заканчиваете x. В языках, поддерживающих так называемое нежадное сопоставление, вы можете использовать его в таком случае, например, в ECMAScript.

      let str = "<div>fruit</div></td>x";
let out_str = str.replace(/^<.*?>/, "");
console.log(out_str);

выход

      fruit</div></td>x

Как сказано в руководстве GNU в GNU AWK он всегда самый длинный (жадный), поэтому вам нужно использовать [^>]то есть все, кроме предотвращения совпадения с первого < до последнего, который будет содержать > внутри.

Другие вопросы по тегам