Sed
對先前正則表達式匹配的行執行正則表達式搜尋(單行)
我需要列印一個長文本文件中唯一行中的字元串。文件中的範例相關行
long.txt
:
Software version 4.0.10, 2002-03-28
想要的字元串正是
4.0.10
.步驟大概是:
- 匹配線;例如,使用正則表達式,例如
/^Software/
- 找到該行後,對其執行搜尋以查找所需的字元串(另一個正則表達式)
- 列印字元串
如何使用或
sed
等工具在一行中完成此操作(請不要使用管道) ?awk``perl
注意:實際的正則表達式並不那麼相關。最重要的是所涉及的命令和語法。謝謝!
這裡有一些選項供您選擇
sed -n 's/Software version \([^,]\+\).*/\1/p' file
awk -F '[ ,]' '$1=="Software" && $2=="version" {print $3}' file
perl -nE '/Software version (.+?),/ and say $1' file
grep -oP '(?<=Software version ).+?(?=,)' file
都假設版本字元串中沒有逗號。
你的問題很籠統;我想花點時間討論一下
sed
這種案例的設計以及它是如何工作的。
sed
是流編輯器。它接受流中的文本輸入——無論是來自管道、單個文件還是來自一個接一個的文件序列——對該文本流執行操作並輸出文本。(請注意,它的最初概念並非旨在或設計用於文件編輯,儘管它經常為此目的而投入使用。)
sed
您應該了解的 ’s 操作的基調是:
sed
逐行處理文本。您給出的命令本質上是一個循環,它對輸入的每一行進行操作(預設情況下),並在最後列印結果(預設情況下)。- 一個命令
sed
由一個可選的條件測試(或“模式”)和一個要執行的動作組成。- 所有動作都是單個字元命令,例如
p
rint、s
ubstitute、d
elete- 最常見的條件是與行匹配的正則表達式,但也可以使用行號。
- 可以指定範圍,意思是:對**從(第一個條件)到(第二個條件)的所有行執行以下操作。
網上有一個非常詳盡的教程和參考資料
sed
,我建議您完整閱讀。對於您的方案,您想要的命令類似於:
sed -n -e '/^Software/{s/,.*//;s/.*[[:space:]]//;p;}' filename
翻譯為:
-n
: 抑制sed
列印每行輸入的預設操作-e
:執行以下sed
命令/^Software/
: 執行以下包含在 中的命令集{}
,僅在與此正則表達式匹配的行上s/,.*//
:從行中刪除第一個逗號(以及之後的所有內容)s/.*[[:space:]]//
: 刪除行中最後一個空格字元之前的所有內容p
:列印結果文本。