
以下はファイルの内容です。"[]" で囲まれたチケット番号のみを印刷する必要があります。sed コマンドと grep コマンドの両方を使用してこれを実行できるかどうか知りたいです。
[request://Problem/26727777] SSO Components (UAT)
[request://Problem/25709048] [SERVER-SETUP] Setup 14xMDN, 10xPRN
[request://Problem/26716590] Logs not populated properly from all servers
[request://Problem/23995808] Prod: Create requestmary
出力は次のようになります。
26727777
25709048
26716590
23995808
試してみましたsed -e 's/[^0-9]//g' ticket | sed '/^$/d'
が、希望する出力が得られませんでした。行には他の数値も含まれており、チケット番号のみを取得する必要があります。
226829515211
226855182
2268555334
226819615
226781310
226853999
226828948216
答え1
GNU を使うことができますgrep
:
$ grep -oP '/\K\d+(?=])' ticket
26727777
25709048
26716590
23995808
またはsed
:
sed -E 's#.*/([0-9]*).*#\1#g' ticket
26727777
25709048
26716590
23995808
上記の両方とも、あなたが示した例では機能しますが、実際のファイルで機能するかどうかは、ファイル内の他の行に依存します。これらは、 の後にあるすべての数字の連続/
と、 の場合はgrep
、 の前にあるすべての数字の連続を出力します]
。これらの条件に一致する他の行がある場合は、ファイル全体を見せる必要があります。
答え2
個人的には perl を使用します。
perl -lne 'print /(\d+)\]/'
うまくいくはずです。
-l
「改行文字を整理する」という意味です。改行文字を行から自動的に削除し、各 の後に挿入しますprint
。
-n
これをループでラップしますwhile (<>) {
。ループは、次のように STDIN (またはファイル) の行ごとに繰り返しますgrep
。
そして、-e
引用符で囲まれたコマンドを実行するには、「式」(または「実行」だと思います)を使用します。(それ以外の場合は、perl
からプログラムを読み取りますSTDIN
)
正規表現のデフォルトの一致は反対であるという事実を使用します$_
(このコンテキストでは、現在の行です)。
キャプチャ グループを指定しているため、「true」または「false」を返すのではなく、キャプチャされた値の (単一要素の) リストを返します。
\d+
は 1 つ以上の数字です。(これは とほぼ同様の「高度な」正規表現ですが[0-9]+
、非ラテン数字を使用する場合は動作が少し異なります)、]
その後に が必要です。
そして私たちはしないg
正規表現の最後に使用すると、1 行につき 1 回のみ一致します。
答え3
sed 's/[^0-9]*\([0-9]*\).*/\1/'
しかし、チケット番号の幅が固定されている場合は、 を使用することをお勧めしますcut
。
編集: grep を使用:
grep -o '^\[[^0-9]*[0-9]*' | grep -o '[0-9]*'
答え4
tr "\[\]/" " "| awk '/request/ { print $3 }'