OS Xのsed - 角括弧の間のすべてのテキストを抽出します。

OS Xのsed - 角括弧の間のすべてのテキストを抽出します。

与えられたフローは次のとおりです。

[foo] 123 [bar]
[gar] dsa [har] 345
[uf] 88 [gc] 43 [br]

これを処理するためにsed(または他のもの)を使用したいので、出力は次のようになります。

foo bar
gar har
uf gc br

頑張ったcat myfile | sed -e 's/^.*\[//;s/\].*$//'

しかし、それは私に最後のインスタンスだけを与えます。

私の実際の入力は次のとおりです。

53f42d4 [the contacts are duplicated] Adding support in picking email verified users [https://trello.com/c/663]
3c454b0 [the contacts are duplicated] splitting contact by phone numbers and emails and changing contact model to contain only 1 email [https://trello.com/c/663]
0e63e5b [we should not let a user confirm his email if we have a user with this confirmed email already] better doc [https://trello.com/c/643]
02671b7 [we should not let a user confirm his email if we have a user with this confirmed email already] preventing updating email if already in used by other user [https://trello.com/c/643]

だから私は最初の行を取得したいと思います:

the contacts are duplicated https://trello.com/c/663

答え1

awkもこれに適しています。[ または ]フィールド区切り記号でそれぞれ印刷優秀土地:

awk -F '[][]' '{for (i=2; i<=NF; i+=2) {printf "%s ", $i}; print ""}' file

sed を使用して次のように作成します。

sed -E 's/(^|\])[^[]*($|\[)/ /g' file

答え2

これは、最初の(左)角かっこ内のすべての項目を数回後に続く最初の(右)角括弧と一致させます。

$ sed 's/[^[]*\[\([^]]*\)\][^[]*/\1 /g' file
foo bar
gar har
uf gc br

説明する:

sed '                      # start a sed script
        s/                 # start a substitute command
        [^[]*              # match all leading characters (except [)
        \[                 # match an explicit [
        \([^]]*\)          # capture text inside brackets.
        \]                 # match the closing ]
        [^[]*              # match trailing text (if any).
        /\1 /              # replace everything matched by the captured text.
        g                  # repeat for all the line.
       ' file              # close script. Apply to file.

これにより、各一致に末尾のスペースが追加されます。削除する必要がある場合は、最後にdeleteを追加してください。

sed -e 's/[^[]*\[\([^]]*\)\][^[]*/\1 /g' -e 's/ $//' file

GNU grepがあれば役に立ちます(一度に1行ずつキャプチャ)。

grep -Po '\[\K[^]]*(?=])'

そして、上記の方法がうまくいかない場合は、awkも機能します。

awk '{print gensub(/\[([^]]*)\][^[]*/,"\\1 ","g")}' file

答え3

慣用的なアプローチは、Lookaroundアサーションを使用することです。https://www.regular-expressions.info/lookaround.htmlただし、sedはこれをサポートせず、PCRE準拠の正規表現プロセッサでのみサポートします。

PerlはデフォルトでmacOSで利用可能である必要があるため、これは実行可能な代替手段かもしれません。

Perlでは、次のように話すことができます。

perl -pe 's/.+?(?<=\[)(.+?)(?=\]).+?/$1 /g'

(行末にスペースが追加されます。)

このパターンの説明については、以下を参照してください。https://regexr.com/41gi5

答え4

使用:

sed -n '/\[/ { s-[^[]*--; s-\[\([^]]*\)\][^[]*- \1-g; s- --p }'

アルゴリズムは次のとおりです。

  • 括弧を含まない行は無視してください。
  • 最初の角かっこの前のテキストを削除します。
  • 角かっこペアとオプションの末尾のテキストを空白に置き換え、角かっこ内のテキストはそのまま残します。
  • 初期スペースを削除し、中間スペースのみを保持します。

関連情報