Удалить все строки только с одной точкой

Попробуйте это:grep -e "^Name.*" -e "^Date.*"и так далее

-4
20.06.2021, 07:52
6 ответов
awk -F'.' 'NF!=2' infile

не печатать эти строки, если они содержат только два поля (i. д, была найдена линия только с одной точкой ). разделитель полей можно указать с помощью опции -F.


или с помощью функции gsub ():

awk 'gsub(/\./, ".")!=1' infile

если количество успешных замен символа точки (самим собой )отлично от одного вхождения, выведите его.

8
28.07.2021, 11:23

Что-то вроде

grep -v '^[^.]*\.[^.]*$' input.txt

Вывести все строки, в которых не соответствуют RE, который ищет одну точку в строке.

4
28.07.2021, 11:23

Вот мое решение sed, в котором используется то же регулярное выражение, что и в grep @shawn:

sed -i.bak '/^[^.]*\.[^.]*$/d' FILE

У него есть (сомнительное )преимущество работы непосредственно с ФАЙЛОМ (, но он записывает FILE.bak с исходным содержимым ). Регулярное выражение занимает всю строку благодаря якорям ^ и $. Если эта строка состоит из строки с нулем или более не -точек [^.]*, за которой следует одна точка, за которой следует ноль или более не -точек [^.]*, она будет удалена.

Протестировано с вводом образца.

3
28.07.2021, 11:23
perl -lne 'print if tr/\.// > 1' data

Или

perl -F/\\./ -nle 'print if @F > 2' data
1
28.07.2021, 11:23

Стандарт POSIX:

  • В строке, содержащей не менее двух точек, выведите n Далее.
  • То, что осталось, — это линия с ровно одной точкой или без нее. Из них удалите точку, несущую.
sed -e '/\..*\./b' -e '/\./d' file

GNU awk:

  • удалите все, кроме точек, запишите длину полученной строки и сравните ее с единицей.
awk 'length(gensub(/[^.]/,"","g",t=$0))-1' file

GNU-сед:

  • сохранить линию в ячейке ожидания для последующего использования.
  • Попробуйте удалить точку.
  • если вы ошиблись, напечатайте строку и затем прочитайте.
  • Если точки не осталось => ровно одна точка в оригинале. Так что удалите его.
  • В противном случае извлеките исходную строку, так как в ней было > 1 точек.
 sed -e 'h;s/\.//;T;//!d;g' file

Перл:

  • Если количество точечных транслитераций равно единице, назначьте разделитель списка ($, ), значением по умолчанию которого является пустая строка.
  • опция -p будет автоматически печатать текущую запись.
perl -pe 'y|.||-1||($_=$,)' file

Питон:

  • понимание списка вместе с предложением if для выбора тех строк, которые разбиты на два или более полей или ни на одно поле.
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
28.07.2021, 11:23

Другой способ взглянуть на это так: вам нужны линии, содержащие как минимум 2 точки (при условии, что вам не нужны линии без точек ). Итак:

LC_ALL=C grep '\..*\.' < input > outpu
3
28.07.2021, 11:23

Теги

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