Как искать строки, которые встречаются в строке более одного раза?

Páselo a través de un juego de caracteres que no admita el plano multilingüe suplementario, como UCS -2.

$ iconv -f utf-8 -t ucs-2 -c input.txt | iconv -f ucs-2 -t utf-8
这是无效的字符  
这是正常的字符  哈
2
18.07.2019, 00:54
3 ответа

Если искомая строка может встречаться в любом месте строки, вы можете выполнить grep 'str.*str'как минимум для двух совпадений.

И если вы хотите сопоставить строку несколько раз, например. по крайней мере три раза, вы могли бы сделать grep '\(.*str\)\{3\}'.

4
27.01.2020, 21:58

Итак, вам нужно сопоставить строки, содержащие строку (, по крайней мере, )"два раза".

  1. Это (с обратными ссылками):

    $ str="string to match";     grep '\('"$str"'\).*\1' file
    

    Предполагая, что strявляется строкой, в которой отсутствуют структуры регулярных выражений (или они правильно заключены в кавычки, чтобы избежать их интерпретации как регулярное выражение ). Конечно, strможет быть регулярным выражением, но оно будет соответствовать строке , первой, и проверять наличие повторов этой строки , а не общих регулярных выражений. То есть:str=h[aeiou]tбудет не соответствовать aaa hot bbb hit cccc, а только hit bbb hit.

  2. Или (с универсальными регулярными выражениями (, вероятно, быстрее)):

    str="string or regex to match";       grep '\(.*'"$str"'\)\{2\}' file
    

    где число 2 может быть легко заменено любым числом (четыре или более здесь):

    str="regex to match"; n=4;            grep '\(.*'"$str"'\)\{'"$n"'\}' file
    

    То есть :это будет соответствовать hat het hit hot hutилиhat hat hat hat

    str='h[aeiou]t'; n=4;                 grep '\(.*'"$str"'\)\{'"$n"'\}' file
    
-1
27.01.2020, 21:58

Невозможно найти 2 или более вхождений строки в строке с помощью grep, поскольку вам нужно использовать конструкции регулярного выражения для объединения «строк», и тогда строки больше не являются строками, это регулярные выражения. Вместо этого вам нужно использовать awk, например. найти 2 или более вхождений строки.*:

$ echo 'foo.*bar' | awk -v str='.*' '(s=index($0,str)) && index(substr($0,s+length(str)),str)'
$
$ echo 'foo.*bar.*etc' | awk -v str='.*' '(s=index($0,str)) && index(substr($0,s+length(str)),str)'
foo.*bar.*etc
-1
27.01.2020, 21:58

Теги

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