2013-06-27 49 views
0

如何在一行的開頭使用通配符? 例如,我想用def替換abcperl中一行的通配符開頭

這是我的文件看起來像

 abc 
    abc 
abc 
hg abc 

現在我想的是abc應僅在前3行更換。怎麼做?

$_ =~ s/['\s'] * abc ['\s'] * /def/g; 

在第一空間開始之前放置什麼條件?

感謝

+0

可以請您像輸出一樣顯示嗎? – user1811486

+0

請注意'\ s'不僅僅是空格,還有其他字符。 – m0skit0

回答

1

試試這個:

$_ =~ s/^['\s'] * abc ['\s'] * /def/g; 

如果需要,從一排開始檢查,然後使用^

此外,我不知道爲什麼你有'和空格在你的正則表達式。在行

開始>零或morespaces這將嚴格用高清代替ABC -

s/(^ *)abc/$1def/g 

(^ *):這也應該爲你工作:

$_ =~ s/^[\s]*abc[\s]*/def/g; 
+0

是的,它工作。謝謝......我在括號中使用'^',因此它不起作用。 – bookishq

+3

'[\ s]'又名'\ s'。 – TLP

+0

這也將擺脫領先的空間。此問題未在問題中指定,但我想這是OP實際需要的。 – m0skit0

2

什麼。

另請注意我已經使用了一個真實空間而不是\s,因爲您說「第一空間的開始」\s比只有空格匹配更多的字符。

+0

我不認爲這些'1)'應該在輸入中。 – TLP

+0

哈哈,謝謝。修復了答案。 – m0skit0

1

使用^字符,並刪除不必要的撇號,空格和[]

$_ =~ s/^\s*abc/def/g 

如果你想保留那名 「ABC」 之前那些空間:

$_ =~ s/^(\s*)abc/\1def/g 
2

您正在你的正則表達式中的一些錯誤

$_ =~ s/['\s'] * abc ['\s'] * /def/g; 
  • 如果您只想從字符串的開頭進行替換(因爲它只能匹配一次),您不需要/g全局,匹配儘可能多的次數)。
  • 在字符類托架,除非使用了/x改性劑的所有字符都是文字除了]-^,所以['\s']手段「匹配空格或撇號'」的正則表達式內
  • 空間字面解釋,(它是不是)
  • 量詞適用於它們之前的任何內容,所以\s*表示「零個或多個空格」,但\s *的意思是「只有一個空格,後面跟零個或多個空格」。再次,除非使用/x
  • 您不需要提供$_ =~,因爲除非另有說明,否則這是任何正則表達式使用的變量。

如果您要更換abc,只有abc當它是第一個非空白在一條線上,你可以這樣做:

s/^\s*\Kabc/def/ 

\K(保持)逃生另一種是捕捉到,如果你想保留空白目標字符串abc下放回

s/^(\s*)abc/$1def/ 

,你不需要做任何事情。如果你想刪除它,只是在最後

s/^\s*\Kabc\s*/def/ 

添加\s*另外請注意,這僅僅是凝結邏輯到一個語句的方式。您也可以通過非常簡單的積木達到相同的:

if (/^\s*abc/) { # if abc is the first non-whitespace 
    s/abc/def/;  # ...substitute it 
} 

因爲(如果不使用/g改性劑)的替代只會發生一次,只有第一場比賽受到影響,這將完美替代abcdef

相關問題