2013-08-22 45 views
0

我正在使用sed將字符串存儲在變量中。我想在文本文件中選擇一行的一部分,但無法這樣做。無法使用sed -n'/.../p'來捕獲部分行

例如,如果從中我想提取文本的文本行是:

{foo bar 1.1.2} foo

而且我想提取bar 1.1.2

我的命令是這樣的: BarVersion=$(sed -n "/bar [.0-9]/p" file.txt)

不過,如果我接着寫:

echo $BarVersion

我發現sed命令已將整行保存在BarVersion中,而不僅僅是我查找的部分。即我得到{foo bar 1.1.2} foo

回答

1

,你可以使用grep像這樣做:

BarVersion=$(grep -o "bar [.0-9]*" file.txt) 

這似乎爲我工作,但它沒有使用SED當然的,但在我看來這是有點簡單。

-o表示僅輸出匹配的行的部分。

2
$ echo '{foo bar 1.1.2} foo' | sed -n 's/^.*\(bar [\.0-9]*\)}.*$/\1/p' 
bar 1.1.2 
  • s/x/y/替代xy
  • \(\)形式,你可以通過\1
  • [\.0-9]*引用一組是任意數量的點.和數字的
  • ^是開始的緩衝區,$已結束
  • .*是任何數目的字符
+0

這也將打印不匹配的所有行的要求模式,並沒有對他們進行替換。當你用'echo'喂一行時不是問題,而是在處理'file.txt'時出現問題。 – Barmar

+0

'-n'防止這種情況。 – 2013-08-22 14:28:00

+0

我的錯誤。我一直認爲最後的'p'是無條件的,但只有在發生替換時纔會打印。 – Barmar

0

如果你正在運行GNU /東西,

sed -nr '/^\{([^ ]*) ([^}]*)\} \1$/ s//\2/p' 

如果匹配的「富的不是它的

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