Как удалить все после определенного шаблона или строки в файле?

Предположим, у меня есть список URL-адресов в текстовом файле:

google.com/funny unix.stackexchange.com/questions isuckatunix.com/ireallydo 

Я хочу удалить все, что приходит после «.com».

Ожидаемые результаты:

 google.com unix.stackexchange.com isuckatunix.com 

Я пытался

 sed 's/.com*//' file.txt 

но он также удалил .com .

4 Solutions collect form web for “Как удалить все после определенного шаблона или строки в файле?”

Чтобы явно удалить все, что приходит после «.com», просто настройте существующее решение sed, чтобы заменить «.com (anything)» на «.com»:

 sed 's/\.com.*/.com/' file.txt 

Я изменил ваше регулярное выражение, чтобы избежать первого периода; иначе он бы подобрал что-то вроде «thisiscommon.com/something».

Обратите внимание, что вы можете захотеть еще больше привязать шаблон «.com» с завершающим косой чертой, чтобы вы случайно не обрезали что-то вроде «sub.com.domain.com/foo»:

 sed 's/\.com\/.*/.com/' file.txt 

Лучший инструмент для неинтерактивного редактирования на месте – ex .

 ex -sc '%s/\(\.com\).*/\1/ | x' file.txt 

Если вы использовали vi и если вы когда-либо вводили команду, начинающуюся с двоеточия : вы использовали команду ex. Конечно, многие из более продвинутых или «причудливых» команд, которые вы можете выполнить таким образом, – это расширения Vim (например, :bufdo ) и не определены в спецификациях POSIX для ex , но эти спецификации позволяют поистине поразительную степень мощности и гибкости в не визуальное редактирование текста (будь то интерактивное или автоматическое).

Команда выше имеет несколько частей.

-s обеспечивает бесшумный режим для подготовки ex для пакетного использования. (Подавлять выходные сообщения и др.)

-c указывает команду для выполнения, как только файл ( file.txt , в этом случае) открывается в буфере.

% – спецификатор адреса, эквивалентный 1,$ -it означает, что для всех строк буфера применяется следующая команда.

s – это команда замены, с которой вы, вероятно, уже знакомы. Он обычно используется в vi и имеет практически идентичные функции для команды s sed , хотя некоторые из расширенных функций регулярного выражения могут отличаться в зависимости от реализации. В этом случае от «.com» до конца строки заменяется просто «.com».

Вертикальная панель разделяет последовательные команды, которые должны выполняться. Во многих (наиболее) ex реализациях вы также можете использовать дополнительный параметр -c , например:

 ex -sc '%s/\(\.com\).*/\1/' -cx file.txt 

Однако это не требуется POSIX.

Команда x завершает работу после внесения любых изменений в файл. В отличие от wq что означает «write and quit», x только записывает в файл, если буфер был отредактирован. Таким образом, если ваш файл не изменяется, метка времени будет сохранена.

Вы можете использовать разделитель полей awk ( -F ) следующим образом:

 $ cat file google.com/funny unix.stackexchange.com/questions isuckatunix.com/ireallydo 

 $ cat file | awk -F '\\.com' '{print $1".com"}' google.com unix.stackexchange.com isuckatunix.com 

Объяснение:

 NAME awk - pattern scanning and processing language 

 -F fs --field-separator fs Use fs for the input field separator (the value of the FS predefined variable). 

Поскольку вы хотите удалить все после .com , -F '.com' разделяет строку с .com и print $1 выдает только часть до .com . Итак, $1".com" добавляет .com и дает ожидаемый результат.

Очень быстрый, простой и грязный способ python:

 #!/usr/bin/env python import sys with open( sys.argv[1] ) as file: for line in file: print line.split("/")[0] 

Прогон образца

 skolodya@ubuntu:$ chmod +x removeStrings.py skolodya@ubuntu:$ ./removeStrings.py strings.txt google.com unix.stackexchange.com isuckatunix.com skolodya@ubuntu:$ cat strings.txt google.com/funny unix.stackexchange.com/questions isuckatunix.com/ireallydo 
  • Sed, Awk Multiline log file, число {0-999] идентифицирует отношение
  • регулярное выражение grep grep в команде sed
  • Группировка в строки на основе того же последнего столбца
  • Как получить строки, чей n-й столбец содержит m-й столбец
  • Найти файлы, для которых несколько вариантов этого имени файла существуют вместе в одном каталоге
  • Как найти и заменить значение столбца поля в UNIX
  • sed: портативное решение для соответствия «любому персонажу, но новой строке»,
  • sed для печати шаблона, который охватывает линии
  • Как использовать sed для замены строки, используя номер строки на удаленной машине, используя ssh?
  • Zsh preexec - Как обрезать все ведущие отступы от кодового блока?
  • Как определить конец строки с sed
  • Linux и Unix - лучшая ОС в мире.