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
这是无效的字符
这是正常的字符 哈
Если искомая строка может встречаться в любом месте строки, вы можете выполнить grep 'str.*str'
как минимум для двух совпадений.
И если вы хотите сопоставить строку несколько раз, например. по крайней мере три раза, вы могли бы сделать grep '\(.*str\)\{3\}'
.
Итак, вам нужно сопоставить строки, содержащие строку (, по крайней мере, )"два раза".
Это (с обратными ссылками):
$ str="string to match"; grep '\('"$str"'\).*\1' file
Предполагая, что str
является строкой, в которой отсутствуют структуры регулярных выражений (или они правильно заключены в кавычки, чтобы избежать их интерпретации как регулярное выражение ). Конечно, str
может быть регулярным выражением, но оно будет соответствовать строке , первой, и проверять наличие повторов этой строки , а не общих регулярных выражений. То есть:str=h[aeiou]t
будет не соответствовать aaa hot bbb hit cccc
, а только hit bbb hit
.
Или (с универсальными регулярными выражениями (, вероятно, быстрее)):
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
Невозможно найти 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