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
он всегда самый длинный (жадный), поэтому вам нужно использовать
[^>]
то есть все, кроме предотвращения совпадения с первого
<
до последнего, который будет содержать
>
внутри.