Мне нужно определить положение символа в строке, используя команду grep.
Например, строка RAMSITALSKHMAN|1223333
.
grep -n '[^a-zA-Z0-9\$\~\%\#\^]'
Как мне найти позицию |
в данной строке?
text-processing
grep
string
user82782
источник
источник
Ответы:
Вы можете использовать
-b
для получения байтового смещения, которое совпадает с позицией для простого текста (но не для UTF-8 или аналогичного).Выше я использую
-a
переключатель, чтобы сказать grep использовать ввод как текст; необходимо при работе с двоичными файлами, и-o
переключатель должен выводить только совпадающие символы.Если вам нужна только позиция, вы можете использовать grep для извлечения только позиции:
Если вы получаете странный вывод, проверьте, включены ли в grep цвета. Вы можете отключить цвета, передав
--colors=never
команду grep или добавив префикс команды grep с помощью\
(который отключит любые псевдонимы), например:Для строки, которая возвращает несколько совпадений, проследуйте,
head -n1
чтобы получить первое совпадение.Обратите внимание, что я использую как в приведенном выше, и обратите внимание, что последний не будет работать, если grep «псевдоним» через исполняемый файл (сценарий или иным образом), только при использовании псевдонимов.
источник
2
;)^
:)0:|
качестве вывода-- потому что 0 это позиция байта начала строки, где|
находится.grep (GNU grep) 2.27
. Возможно, вы используете OS X?Пытаться:
вывод:
Это даст вам позицию с индексом на основе-1.
источник
printf '%s\n' '|' | grep -o . | grep -n '|'
печатает1
не так,0
как ожидалось.Если вы используете оболочку bash , вы можете использовать чисто встроенные операции без необходимости порождения внешних процессов, таких как grep или awk :
При этом используется расширение параметра, чтобы удалить все вхождения
|
после любой строки и сохранить его во временной переменной. Тогда нужно просто измерить длину временной переменной, чтобы получить индекс|
.Обратите внимание, что
if
проверяется,|
существует ли вообще исходная строка. Если этого не произойдет, тогда временная переменная будет такой же, как и оригинальная.Также обратите внимание, что это обеспечивает нулевой индекс,
|
который обычно полезен при индексации строк bash. Однако если вам требуется индекс на основе одного, то вы можете сделать это:источник
Вы можете использовать
index
функцию awk для возврата позиции в символах, где происходит совпадение:Если вы не возражаете против использования функции Perl
index
, это обрабатывает сообщение об отсутствии, одном или нескольких вхождениях символа:Только для удобства чтения конвейер разделен на две строки.
Пока целевой символ найден,
index
возвращает положительное значение, основанное на нуле (0). Следовательно, строка «abc | xyz | 123456 | zzz |» при разборе возвращает позиции 0, 4, 8, 15 и 19.источник
RAMSITALSKHMAN|1|223333
Мы также можем сделать это, используя «expr match» или «expr index»
expr соответствует $ string $ substring, где $ substring является RE.
И выше даст вам позицию, потому что он возвращает длину совпадающей подстроки.
Но чтобы быть более конкретным для поиска индекса:
источник
awk
решения могут быть тривиально изменены для сообщения этой информации в каждой строке файла (все, что вам нужно сделать, это удалить тоEND
, что никогда не было действительно необходимым, из ответа JRFerguson, а Avinash Raj уже делает это) ; тогда как, чтобы сделать это сexpr
решением, вам нужно было бы добавить явный цикл (а ответ Gnouc совсем не так легко сделать, что я вижу), и (2)awk
решения могут быть адаптированы так, чтобы сообщать обо всех совпадения в каждой строке несколько проще, чемexpr
решение (на самом деле, Avinash Raj's тоже это делает).echo `...`
здесь?Еще одна команда awk ,
Устанавливая разделитель полей как пустую строку, awk превращает отдельный символ в записи в отдельные поля.
источник
некоторые альтернативы включают в себя:
аналогично ответу Гнука, но с оболочкой:
с
sed
иdc
возможно охватывая несколько строк:с
$IFS
...Это будет также сказать вам , как много есть , как ...
источник