Як видалити решту кожного рядка після певного шаблону чи рядка у файлі?


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лише замість того, щоб видаляти все після та включити першого /символу? Що робити, якщо en.wikipedia.org/wiki/Ubuntuу вашому списку була така URL-адреса ?
Командир байт

Відповіді:


17

Щоб явно видалити все, що з’явиться після ".com", просто налаштуйте існуюче рішення sed, щоб замінити ".com (що-небудь)" на ".com":

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

Я підмітив твій регекс, щоб уникнути першого періоду; інакше воно відповідатиме чомусь на кшталт "thisiscommon.com/something".

Зауважте, що ви можете додатково закріпити шаблон.

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та дає очікуваний результат.


Чому б не так, /як FS і взяти перше поле?
heemayl


1
@Pandya: Ця помилка з таким рядкомacomercial.com/asdsad
cuonglm

@cuonglm Дякую за вказівку. Удосконалена відповідь
Пандія,

4

Найкращим інструментом неінтерактивного редагування файлів на місці є ex.

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

Якщо ви використовували viі якщо ви коли-небудь вводили команду, яка починається з двокрапки, :ви використовували колишню команду. Звичайно, багато більш досконалих або "фантазійних" команд, які ви можете виконати таким чином, є розширеннями Vim (наприклад :bufdo) і не визначені в специфікаціях POSIX дляex , але ці специфікації дозволяють по-справжньому дивовижною мірою потужності та гнучкості в невидимих редагування тексту (будь то інтерактивне чи автоматизоване).

Команда вгорі має кілька частин.

-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він записує у файл лише у тому випадку, коли буфер був відредагований. Таким чином, якщо файл не змінився, часова марка буде збережена.


1
+1 за використання екс
Джеффа Шаллера

1
Це не редагує на місці. Принаймні, це не більше, ніж sedфіктивна- Gnu . Він читає / записує на дискові буфери. Побачте собі ж / ex -rта preserveкоманду.
mikeserv

@mikeserv Що це за preserveкоманда?
Mateen Ulhaq

2

Дуже швидкий, простий і брудний спосіб пітона:

#!/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, він просто прибирає все, починаючи з першого /в рядку. (що, на мій погляд, навіть кращий підхід!)
Командир байт

1
@ByteCommander точно так! Якщо доменне ім'я є .net, в інших підходах частина, що з’являється після домену та розширення, не видалятиметься, тому безпечніше використовувати його /як роздільник.
Сергій Колодяжний

+1 для відповіді та коментарів, завдяки чому я відчуваю, що перебуваю на AskUbuntu.com: D
WinEunuuchs2Unix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.