Sed

對先前正則表達式匹配的行執行正則表達式搜尋(單行)

  • March 29, 2016

我需要列印一個長文本文件中唯一行中的字元串。文件中的範例相關行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由一個可選的條件測試(或“模式”)和一個要執行的動作組成。
  • 所有動作都是單個字元命令,例如print、substitute、delete
  • 最常見的條件是與行匹配的正則表達式,但也可以使用行號。
  • 可以指定範圍,意思是:對**從(第一個條件)(第二個條件)的所有行執行以下操作。

網上有一個非常詳盡的教程和參考資料sed,我建議您完整閱讀。

對於您的方案,您想要的命令類似於:

sed -n -e '/^Software/{s/,.*//;s/.*[[:space:]]//;p;}' filename

翻譯為:

  • -n: 抑制sed列印每行輸入的預設操作
  • -e:執行以下sed命令
  • /^Software/: 執行以下包含在 中的命令集{},僅在與此正則表達式匹配的行上
  • s/,.*//:從行中刪除第一個逗號(以及之後的所有內容)
  • s/.*[[:space:]]//: 刪除行中最後一個空格字元之前的所有內容
  • p:列印結果文本。

引用自:https://unix.stackexchange.com/questions/272729