14

grep を使用して単語の先頭を削除するにはどうすればよいですか? 例: 以下を含むファイルがあります。

www.abc.com

その部分だけ欲しい

abc.com

基本的な質問で申し訳ありません。しかし、Linux の経験はありません。

4

6 に答える 6

14

grepUnix シェルでは文字列を編集しませんgrep。通常、テキストからいくつかの行を検索または削除するために使用されます。代わりに使用したいsed

$ echo www.example.com | sed 's/^[^\.]\+\.//'
example.com

効果的に使用するには、正規表現を学ぶ必要があります。

sed は、引数を渡せば、その場でファイルを編集 (ファイルを変更) することもできますが、間違ったコマンドを書いてフラグを使用すると-i、データを簡単に失う可能性があることに注意してください。sed-i

あなたのコメントから、あなたは TeX ドキュメントを持っていて、すべての .com ドメイン名の最初の部分を削除したいと思っていると思います。それがあなたの文書である場合test.tex

\documentclass{article}
\begin{document}
www.example.com
example.com www.another.domain.com
\end{document}

次に、このコマンドでそれを変換できますsed(出力をファイルにリダイレクトするか、でその場で編集します-i):

$ sed 's/\([a-z0-9-]\+\.\)\(\([a-z0-9-]\+\.\)\+com\)/\2/gi' test.tex 
\documentclass{article}
\begin{document}
example.com
example.com another.domain.com
\end{document}

その点に注意してください:

  • 許可された記号とそれに続くドットの一般的なシーケンスは、次のように一致します。[a-z0-9-]\+\.
  • URL の最初と 2 番目の部分を示すために、正規表現でグループ ( と 内の部分) を使用\(\)、一致全体をその 2 番目\2のグループ (置換パターン) に置き換えます。
  • ドメインは少なくとも第 3 レベルの .com ドメインである必要があります (すべての\+繰り返しは少なくとも 1 つの一致を意味します)
  • 検索では大文字と小文字が区別されません (i末尾のフラグ)。
  • 行ごとに一致する以上のことができます(g最後にフラグ)
于 2012-07-26T16:01:34.600 に答える
7

これは、次を使用してgrep簡単に実行できます。

$ echo www.google.com | grep -o '[^.]*\.com'
google.com

代わりにecho、ファイルを提供する必要があります。

$ grep -o '[^.]*\.com$' < file

ここでは正規表現 '[^.]*.com' を使用しました。つまり.、( [^.]*) のない単語を見つけてください。その後に.com( \.comre ) が続きます。-oキーは、見つかった部分だけを表示する必要grepがあることを示しています。

于 2012-07-26T18:42:31.683 に答える
7

他の人が指摘しているように、grepこのタスクにはあまり適していないsedか、良いオプションです。または、テキストが適切に整理されている場合は、シンプルなcut方が入力しやすいかもしれません:

echo www.abc.com | cut -d. -f2-
  • -d.区切り文字としてcut使用するよう指示します。.
  • -f2-cutフィールド 2 を無限大に戻すように指示します。
于 2012-07-26T16:34:39.690 に答える
4

grep--only-matching\K

grep の--only-matchingフラグを使用してこれを行うことができます。

echo "www.abc.com" | grep --perl-regexp --only-matching 'www.\K.*'

に短縮することができます

echo "www.abc.com" | grep -Po 'www.\K.*'

両方のコマンドが生成します

abc.com

grep (GNU grep) 3.3 を使用。

の代わりにechoヒア文字列を使用してコマンドをさらに短縮します。

grep -Po 'www.\K.*' <<< "www.abc.com"

\K一致した「www.」を本質的に忘れて、一致の開始点をリセットします。の詳細については、これを参照してください\K

grep の肯定的な後読みで

肯定的な後読みでもこれを行うことができます:

grep -Po '(?<=www.).*' <<< "www.abc.com"

awk のフィールドセパレータを使用-F

awk -F 'www.' <<< "www.abc.com" '$2{print $2}'

これは印刷します

abc.com

$2{print $2}定義されている場合、パーツは 2 番目のフィールドを出力します。これは、複数行入力の場合に、フィールド セパレータを含まない入力行に対して空白行が出力されないようにするために必要です。

于 2019-05-21T10:27:02.467 に答える
3

grepテキストの操作/変更には使用されず、テキスト/テキスト内のパターンの検索にのみ使用されます

コマンドラインツールで実行したい場合は、orsedのようなものを調べる必要があります。または、Python/Perl/Ruby などでスクリプトを作成します。awkcut

于 2012-07-26T16:00:59.407 に答える