バックティック間のgrep文字列

バックティック間のgrep文字列
`someString` complete(1)

バックティックの間に「someString」が必要です。以下で試しましたが、うまくいきません。

cat file.txt | grep '\`.*\`'

答え1

GNUによるgrepサポートポリメラーゼ連鎖反応拡大する:

grep -Po '(?<=`)[^`]*(?=`)' infile

またはreturn ac例えば`a`b`c`できます。:

grep -Po '(?<=`)[^`]+(?=`(?:[^`]*`[^`]*`)*[^`]*$)'

バックティックペア間のすべての内容を返します。

ヒント:
(?<=...):過去を振り返ると肯定的です
(?=...):積極的で積極的な
(?:...):非キャプチャグループ
[^`]*: バックティック以外のすべての文字`


そしてawk

awk -F'`' '{ for(i=2; i<=NF; i+=2) print $i; }' infile

答え2

使用cut:

cut -d'`' -f2  < file.txt

答え3

grepはデフォルトで以下を返します。ワイヤー与えられた表現と一致します。したがって、式は式に一致する行全体を返します。

grepsedを使用する代わりに、探している文字列を含む行を編集できます。

行に1つのバックティック文字列しかないと仮定すると、最初のバックティックの前のすべてのアイテムと2番目のバックティックの後のすべてのアイテムを切り取ることができます。

$ sed 's/[^`]*`//; s/`.*//' <file.txt
someString

バックティックは正規表現では特別ではないので、エスケープする必要はありません。バックティックはいはシェルに特別ですが(コマンド置換が導入されています)、一重引用符で囲まれた文字列を使用するため、シェルはこれを特別に扱いません。


\(...\)キャプチャグループ(in)の逆引用符の間の文字列を一致させてから、行全体をそれに置き換えることも可能ですsed(しかし、個人的にこれは読み方が少し難しくなると思います)。

$ sed 's/[^`]*`\([^`]*\)`.*/\1/' <file.txt
someString

上記の表現で使用されているすべては、[^`]「バックティックではなく特定の文字」を意味します。


まったく異なるアプローチは、最初にすべてのバックティックを削除してから、行の空白の前にあるすべてを削除することです。

$ tr -d '`' <file.txt | sed 's/[[:blank:]].*//'
someString

文字[[:blank:]]クラスは単一のスペースまたはタブ文字と一致します。

これは明らかに、バックティック文字列が空白文字を含まない単語であり、質問の例のように、その行で最初に発生すると仮定します。


戻るgrep... 1行あたりの式に一致するビットのみを返す非grep標準(ただし一般的に実装されている)オプションがある場合は、次のように使用できます。-o

$ grep -o '`[^`]*`' <file.txt | tr -d '`'
someString

まず、バックティック文字列を取得してからバックティックを削除します。sed1行に複数のバックティック文字列がある場合、このメソッドは異なる動作をします。この場合、これは各文字列を対応する行に返しますが、バリアントはsed次のようになります。最初バックティック文字列。

答え4

コマンド1

awk '{for(i=1;i<=NF;i++){if($i ~ /^`.*`/){gsub("`","",$0);print $i}}}' filename


Above command tested and worked fine

関連情報