私に合うsedの次の正規表現があります。
cat <<EOF | sed -E '/^([A-Z][a-z]+){2,}$/Q'
Nothing Relevant
TotallyFake:
- NowWeWant
- TheseLines
- AndAlsoThisLine
ButNotThisLine
- OrThisLine
EOF
これは私たちが望む行だけを出力しますが、ヘッダー行も出力しますが、これはうまくいきません。だから周りを見回して/this/,/that/
方法を見つけて、本当にカッコイイ!!と思いました。最初のPascalishCaseコンテンツを見つけて、最初の空白行で停止できます。
だから私はこれを試しました:
cat <<EOF | sed -En '/^- ([A-Z][a-z]+){2,}$/,/^$/p'
Nothing Relevant
TotallyFake:
- NowWeWant
- TheseLines
- AndAlsoThisLine
ButNotThisLine
- OrThisLine
EOF
ところで…それは私にそれを与えたOrThisLine
。これは理想的ではありません。
-
sedを使用してaで始まるPascalTextの最初のブロックを見つけて、その行だけを印刷するにはどうすればよいですか?
[編集する]
内容が十分に明確ではないので、私が望む結果は次のとおりです。
- NowWeWant
- TheseLines
- AndAlsoThisLine
私の理解は、最初の項目が見つかり、「this」の後の最初の項目に移動しますが、パターンが最初の空白行と一致せず、/this/,/that/
EOFと一致するようです。this
that
^$
答え1
これが次のYAMLファイルであるとします(配列要素のインデントはオプションです)。
---
Somesection:
Someothersection:
TotallyFake:
- NowWeWant
- TheseLines
- AndAlsoThisLine
ButNotThisLine:
- OrThisLine
TotallyFake
...そして最上位配列の要素を取得したいと思います。
Mike Farah(Linuxで最も一般的に使用されている)を使用して、TotallyFake
次のように最上位配列(YAML)を抽出できます。yq
yq
$ yq '.TotallyFake' file
- NowWeWant
- TheseLines
- AndAlsoThisLine
配列内の要素を別の行として必要に応じて、TotallyFake
最後に次を追加して配列を展開します。[]
$ yq '.TotallyFake[]' file
NowWeWant
TheseLines
AndAlsoThisLine
yq
Andrey Kislyuk(よく知られているJSONプロセッサjq
のラッパー)の対応するコマンドを使用してください。
$ yq -y '.TotallyFake' file
- NowWeWant
- TheseLines
- AndAlsoThisLine
ここでのオプションは、データをYAMLに抽出することを-y
意味します。yq
これがなければ、JSONでエンコードされた配列(同等)が得られます["NowWeWant","TheseLines","AndAlsoThisLine"]
。
要素を別の行にインポートするには、次の手順を実行します。
$ yq -r '.TotallyFake[]' file
NowWeWant
TheseLines
AndAlsoThisLine
この-r
オプションは、デコードされた(「生」)文字列を提供します。
を使用して、sed
入力を構造化文書形式の文書ではなくテキストとして扱います。
$ sed -e '/^TotallyFake:/,/^$/!d' -e '//d' file
- NowWeWant
- TheseLines
- AndAlsoThisLine
これにより、関心のあるセクションの外側のすべての行が削除され、2番目のd
コマンドを使用して実際の範囲の開始行と終了行が削除されます。空の正規表現は、sed
最も最近一致した正規表現を再利用するように指示する特別な構文です。
この点に注意してください頼るTotallyFake
YAML文書のオプションのスペース(配列の最後の要素の後の空白行)。