閱讀一本關于 bash 的書,它通過一個例子介紹了正則運算式(我對它們很陌生):
rename -n 's/(.*)(.*)/new$1$2/' *
'file1' would be renamed to 'newfile1'
'file2' would be renamed to 'newfile2'
'file3' would be renamed to 'newfile3'
不幸的是,這個例子并沒有提供真正的細分。我有點明白什么是捕獲組, .* 是貪婪的,會匹配所有字符,但我不確定為什么需要兩個捕獲組。另外,我知道 $ 代表行尾,但不確定 $1$2 在這里實際做什么。感謝提供的任何見解。
試圖研究捕獲組和一些類似示例的 $ 并進行解釋,但結果很短。
uj5u.com熱心網友回復:
你是對的。(.*)(.*)沒有意義。第二個.*將始終匹配空字串。
例如,匹配file,
- 第一個
.*將匹配從位置 0 (file) 開始的 4 個字符的字串,并且 - 第二個
.*將匹配從位置 4(空字串)開始的 0 字串。
您可以將模式簡化為
rename -n 's/(.*)/new$1/' *
rename -n 's/.*/new$&/' *
rename -n 's/^/new/' *
rename -n '$_ = "new$_"' *
rename -n '$_ = "new" . $_' *
uj5u.com熱心網友回復:
我不知道那個rename命令。正則運算式看起來像sed語法。如果是這種情況(與許多其他正則運算式一樣),它有 3 個部分:
s替補- 前兩個斜杠之間的所有內容
(.*)(.*)以指定要匹配的內容 - 第二個和第三個斜杠之間的所有內容
new$1$2都是替換
$僅表示正則運算式第一部分的行尾。第二部分$編號指的是捕獲組,$1是第一組,$2第二組等等,$0通常是整個匹配的文本。
你是對的,.*貪婪,重復這一點毫無意義。也許\.介于兩者之間,那是嘗試捕獲檔案名和擴展名。有更好的方法來決議檔案名,例如basename. 所以你可以將命令簡化為rename -n 's/(.*)/new$1/' *
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/536805.html
標籤:狂欢perl改名pcre
上一篇:如何在bash中查找表中第一列包含1(或特定數字)的所有行?
下一篇:重定向在命令列中走多遠?
