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

21

Предположим, у меня есть список 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.

Кошур
источник
Есть ли конкретная причина, по которой вы хотите искать .comтолько вместо того, чтобы удалять все после и включая первый /символ? Что делать, если у вас есть URL-адрес, как en.wikipedia.org/wiki/Ubuntuв вашем списке?
Byte Commander

Ответы:

17

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

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

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

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

sed 's/\.com\/.*/.com/' file.txt
Джефф Шаллер
источник
9

Вы можете использовать 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и дает ожидаемый результат.

Pandya
источник
Почему бы просто не так /как ФС и занять первое поле?
Heemayl
1
@Pandya: Это терпит неудачу со строкой какacomercial.com/asdsad
cuonglm
@cuonglm Спасибо за указание. Улучшенный ответ
Pandya
4

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

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

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

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

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

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

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

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

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

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

Тем не менее, это не требуется POSIX.

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

Wildcard
источник
1
+1 за использование экс
Джефф Шаллер
1
Он не редактирует на месте. По крайней мере, это не так, как фальшивка Гну sed-i. Он читает / пишет в буферы на диске. Смотрите сами с ex -rпомощью preserveкоманды.
mikeserv
@mikeserv Какая preserveкоманда?
Матин Улхак
2

Очень быстрый, простой и грязный способ 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
Сергей Колодяжный
источник
2
Могу ли я узнать причину понижения?
Сергей Колодяжный
3
Это работает, но это не волнует .com, оно просто удаляет все, начиная с первого /в строке. (что, на мой взгляд, даже лучший подход!)
Byte Commander
1
@ByteCommander совершенно верно! Если доменное имя есть .net, в других подходах часть, которая идет после домена и расширения, не будет удалена, поэтому безопаснее использовать в /качестве разделителя.
Сергей Колодяжный
+1 за ответ и комментарии, которые заставляют меня чувствовать, что я нахожусь в AskUbuntu.com: D
WinEunuuchs2Unix