
`someString` complete(1)
バックティックの間に「someString」が必要です。以下で試しましたが、うまくいきません。
cat file.txt | grep '\`.*\`'
答え1
GNUによるgrep
サポートポリメラーゼ連鎖反応拡大する:
grep -Po '(?<=`)[^`]*(?=`)' infile
またはreturn a
、c
例えば`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
はデフォルトで以下を返します。ワイヤー与えられた表現と一致します。したがって、式は式に一致する行全体を返します。
grep
sed
を使用する代わりに、探している文字列を含む行を編集できます。
行に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
まず、バックティック文字列を取得してからバックティックを削除します。sed
1行に複数のバックティック文字列がある場合、このメソッドは異なる動作をします。この場合、これは各文字列を対応する行に返しますが、バリアントはsed
次のようになります。最初バックティック文字列。
答え4
コマンド1
awk '{for(i=1;i<=NF;i++){if($i ~ /^`.*`/){gsub("`","",$0);print $i}}}' filename
Above command tested and worked fine