Попробуйте это:grep -e "^Name.*" -e "^Date.*"
и так далее
awk -F'.' 'NF!=2' infile
не печатать эти строки, если они содержат только два поля (i. д, была найдена линия только с одной точкой ). разделитель полей можно указать с помощью опции -F
.
или с помощью функции gsub ():
awk 'gsub(/\./, ".")!=1' infile
если количество успешных замен символа точки (самим собой )отлично от одного вхождения, выведите его.
Что-то вроде
grep -v '^[^.]*\.[^.]*$' input.txt
Вывести все строки, в которых не соответствуют RE, который ищет одну точку в строке.
Вот мое решение sed, в котором используется то же регулярное выражение, что и в grep @shawn:
sed -i.bak '/^[^.]*\.[^.]*$/d' FILE
У него есть (сомнительное )преимущество работы непосредственно с ФАЙЛОМ (, но он записывает FILE.bak с исходным содержимым ). Регулярное выражение занимает всю строку благодаря якорям ^ и $. Если эта строка состоит из строки с нулем или более не -точек [^.]*
, за которой следует одна точка, за которой следует ноль или более не -точек [^.]*
, она будет удалена.
Протестировано с вводом образца.
perl -lne 'print if tr/\.// > 1' data
Или
perl -F/\\./ -nle 'print if @F > 2' data
Стандарт POSIX:
sed -e '/\..*\./b' -e '/\./d' file
GNU awk:
awk 'length(gensub(/[^.]/,"","g",t=$0))-1' file
GNU-сед:
sed -e 'h;s/\.//;T;//!d;g' file
Перл:
perl -pe 'y|.||-1||($_=$,)' file
Питон:
python3 <<\eof
with open('file') as f:
print(*[l for l in f if len(l.split('.')) != 2],sep='',end='')
eof
Стандартный grep, в котором несколько -операторов e означают операцию ИЛИ
$ grep -e '\..*\.' -e '^[^.]*$' file
Другой способ взглянуть на это так: вам нужны линии, содержащие как минимум 2 точки (при условии, что вам не нужны линии без точек ). Итак:
LC_ALL=C grep '\..*\.' < input > outpu