web-dev-qa-db-ja.com

grepを実行して一致する文字列のみを取得する方法は?

質問に100%一致しないため、タイトルを自由に変更してください

私はこのようなものをファイルに持っています:

junk
long_ass_string "/I/want/this/$code/$name" long_ass_string
junk

例を明確にする:

  • / I/want/this /の部分は常に同じです
  • $ codeおよび$ nameは動的で、文字列ごとに異なります
  • 内部long_ass_stringさらに多くの/ I/want/this/$ code/$ name文字列がある可能性があり、それらすべてを取得したいと考えています。
  • 引用符(this => ")は、すべての/ I/want/this/$ code/$ name文字列に存在します。

これまでに試しました...

grep -w "/I/want/this/*" file#long_ass_stringを出力します
grep -o "/I/want/this/*" file#出力/ I/want/this /

前後にx個の余分な文字のみを取得するソリューションの使用を避けたい

4
sysfiend

私はすべての文字列をgrepで処理し、2番目のgrepで整理します。

grep -o '"[^"]*"' file

出力:

"/I/want/this/$code/$name"

正規表現の使用についてコメントする

この式/I/want/this/*/I/want/thisに一致し、次に0個以上のスラッシュ文字に一致します。おそらく、/I/want/this/.*/I/want/this/および0個以上の文字に一致します。

4
Thor

私がよく理解している場合は、各行の最初の$ code変数と$ name変数を取り除く必要があります。結果をパイプしてそのためにカットできます。あなたの例に従って:

grep "/I/want/this/" myfile.txt | cut -d '/' -f 1-4,7-

-dを使用して区切り文字(たとえば、記号/)を定義し、-fを使用して、取得するフィールドを指定します。
この場合、区切り文字1から4(/I/want/this/)までと、7番目の区切り文字の後に続くすべてのフィールド(引数7-で行われます)このように、/$code/$nameは、定義された正規表現に一致するすべての行の4〜7番目の区切り文字です。

echo "/I/want/this/NOT/THAT/and/everythingelse" | grep "/I/want/this/" | cut -d '/' -f 1-4,7- 
/I/want/this/and/everythingelse
0
kcdtv