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

Предположим, у меня есть список 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 
  • Инкремент чисел внутри строк смещением
  • Переименование файлов с номерами в соответствующие 1-n числа в порядке
  • Как удалить все строки с «.png» в файле?
  • Как печатать пустые места в первом столбце с помощью awk или sed
  • Как заменить текст после определенного слова с помощью sed?
  • Bash для сопоставления двух переменных для разницы во времени
  • CSV - преобразование НЕКОТОРЫХ столбцов в строки с дублированными данными
  • Что означает эта команда sed?
  • sed, чтобы заменить строку из одного файла на все содержимое другого файла
  • «Дополнительные символы после команды» в команде sed a
  • Sed + как установить параметры в команде sed, чтобы отображать строки из текстового файла
  • Как мне искать файл для строки, а затем использовать его как переменную?
  • Interesting Posts

    Ошибка установки Xampp

    Как отключить SELinux без перезагрузки?

    Как найти и заменить текст во всех открытых файлах с помощью jed?

    Организация беспорядочной папки на основе типа файла

    Сценарий Telnet BASH – вывод не сохраняется

    nmap output: что означает «время безотказной работы»?

    Зеркало RAID-1 стало единственным жестким диском

    Монетный двор Linux: сделать «общедоступную интерактивную пусковую установку» только из корня sh?

    Разрешения для файлов для ядра изменились в OSX Yosmite, почему?

    tcsh: введите 2-значные часы в строке

    Почему первый дескриптор `/` смонтированного раздела и inode `/` отличается?

    Почему байты, которые я получаю, не являются байтами, которые я отправил?

    «PermitRootLogin no» в конфигурации sshd не предотвращает `su“

    Snapper делать снимки только в том случае, если что-то изменилось, или при более низкой каденции

    Что такое символ или символ, и каково его значение вне форматирования кода SE?

    Linux и Unix - лучшая ОС в мире.