
以下是文件的內容,我只需要列印「[]」中包含的票號。很想知道是否可以使用 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
上述兩者都適用於您給出的範例,但它們是否適用於您的真實文件將取決於文件中的其他行。它們印出 a 之後的所有數字/
,對於grep
,印出 a 之前的所有數字]
。如果您還有其他符合這些條件的行,您將需要向我們展示您的整個文件。
答案2
我個人會使用perl。
perl -lne 'print /(\d+)\]/'
應該做到這一點。
-l
說“整理換行符” - 它會自動將它們從行中刪除,並將它們插入到每個print
.
-n
說'將其包裝在一個while (<>) {
循環中 - 它像會那樣逐行迭代 STDIN (或文件)grep
。
並且-e
是“表達式”(或“執行”我猜)來運行引號中的命令。 (否則perl
請從 讀取程式STDIN
)
我們使用正規表示式的預設匹配是 against $_
(在這種情況下,即當前行)這一事實。
因為我們指定了一個捕獲組,所以它返回捕獲值的(單個元素)列表,而不是返回“true”或“false”:
\d+
是一位或多位數字。 (這是一個“高級”正則表達式,與 大致相似[0-9]+
,但如果您使用非拉丁數字,其工作方式會有所不同),並且我們需要在]
其後面添加一個。
並且因為我們不g
在正規表示式的末尾使用,每行僅匹配一次。
答案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 }'