特定のパターンまたはファイル内の文字列の後、各行の残りを削除する方法は?


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(anything)」を「.com」に置き換えます。

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

最初の期間を逃れるために正規表現を調整しました。そうでなければ、「thisiscommon.com/something」のようなものに一致するでしょう。

「sub.com.domain.com/foo」のようなものを誤ってトリミングしないように、末尾のスラッシュで「.com」パターンをさらにアンカーしたい場合があることに注意してください。

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したことがあり、コロンで始まるコマンドを入力したことがある:場合は、exコマンドを使用しました。もちろん、この方法で実行できるより高度なまたは「派手な」コマンドの多くは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
その場で編集しません。少なくとも、それはGnu sedの偽の-i よりも多くはありません。オンディスクバッファの読み取り/書き込みを行います。w / ex -rpreserveコマンドを参照してください。
mikeserv

@mikeserv preserveコマンドは何ですか?
Mateen Ulhaq

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
downvoteの理由を教えてください。
セルギーコロディアズニー16

3
それは動作しますが、気にしません.com、それは単に/行の最初から始まるすべてを削除します。(これは私の意見ではより良いアプローチです!)
バイト司令官

1
@ByteCommanderまさに正しい!ドメイン名がの.net場合、他のアプローチでは、ドメインと拡張子の後に来る部分は削除されないため、/セパレータとして使用する方が安全です。
セルギーコロディアズニー16

AskUbuntu.comにいるような気分にさせる回答とコメントに+1:D
WinEunuuchs2Unix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.