2011-02-25 92 views

回答

4

如果字符串是$_

s/\D+?$//; 

[編輯]:如果該行可能以結尾,則應使用非貪婪匹配(+?),以避免剝奪這個角色(感謝DanD指出了這一點)。這是因爲$將匹配字符串末尾或緊接在字符串末尾的\n之前。

當行文字工作,它通常是一個好主意,通過調用chomp()先去掉所有尾隨\n,然後做力所能及的工作是必要的,最後追加\n當行寫出。這簡化了處理後綴並計算了行的長度,並且非常有用,perl提供了-l選項來使單行程的過程自動化。在這種情況下,簡單的s/\D+$//;可用於:

perl -lpe "s/\D+$//" <in.txt> out.txt 
+1

是否有任何刪除每行結尾的換行符的可能性有了這個? \ n由\ D匹配,所以假設如果您將它放在一個經過文件中每一行的while塊中,它也會刪除\ n?或者我有這個錯誤? – Literat 2011-02-25 22:45:03

+0

@DanD:你說得很對,我會更新。在做任何事情之前,我通常會假定這條路線已經被砍掉了,但是明確的話是值得的。 – 2011-02-25 22:52:22

5

試試這個:$line =~ s/\D+\z//;

+0

我給了這個+1,但值得記住的是'\ z'匹配字符串的結尾,所以如果字符串有一個尾部的'\ n'就不會工作(這會發生,例如,如果你'從文件中讀取文本行而不是'chomp')。 – 2011-02-25 22:48:42

+0

當然會!你告訴我你認爲換行符是'\ d'代碼點,是嗎?既然它不是'\ d',那麼它必須是'\ D'。 Qᴇᴅ。 – tchrist 2011-02-26 01:20:19

+0

@tchrist:真的,它會匹配和去除'\ n',但我不會稱之爲「工作」 - 如果我們正在處理以'\ n'結尾的字符串,它們應該保持以'\ n'結尾,你不同意嗎? – 2011-02-26 02:36:42

0

試試這個:

$str =~ s/(?<=\d)\D+//; 

你可能想扔\b在那裏,如果有多個目標在線:

$str =~ s/(?<=\d)\D+\b//; 

如果你只有萬噸至影響行的最後一場比賽,你可以使用$來代替:

$str =~ s/(?<=\d)\D+$//; 
+1

這會將'12ABC345'變成'12345'。 – 2011-02-25 21:57:38

+0

@j_random_hacker:他原來的要求並沒有說這種輸入是一種可能性,或者提出了處理它的規則。它是開放的解釋,所以我提供了最簡單的模式。不過,我已經在編輯建議將其考慮在內。請參閱編輯。 – 2011-02-25 22:02:13

+0

他沒有說它*也不是*的可能性。你不能假設非數字永遠不會出現在一行的中間,僅僅因爲他們沒有在他的一個例子中。此外,不知道你爲什麼建議'\ b' - 也許有線上的其他項目,他不希望尾隨非數字剝離。另外,在OP的帖子中「最後一個數字字符後面」意味着至少有一個數字,所以'(?<\ d)'是不必要的。 – 2011-02-25 22:11:17

-1

s/[A-Za-z]{2}$//;

或者,如果你想要一個一行,在DOS提示符下鍵入在:

perl -pe "s/[A-Za-z]{2}$//" <a.txt >b.txt

這從在每A.TXT行的末尾去除2個字母字符和保存新的數據到b.txt

如果線路沒有按以2個字母字符結尾,那麼該行不會被修改。如果b.txt不存在,則創建它。如果b.txt存在,則b.txt中的任何舊內容都將被銷燬。 a.txt和b.txt需要位於您鍵入單行內容時所處的目錄中,例如如果您在C:\用戶中輸入單行比a.txt和b.txt還需要C:\ users

+0

爲什麼假設後綴將是正好2個字符?他的例子僅僅是一個例子* - 他明確地說,「基本上是從右到左移除最後一個數字後面的任何字符」。爲什麼你認爲a.txt和b.txt需要在C:\?曾聽說過'cd'? – 2011-02-25 22:44:32

+0

是啊,這是真的 - 發佈後我認爲你的答案似乎符合OPs需求更好,因爲它將是最大的。如果您將目錄更改爲使用cd \ users的C:\用戶,那麼這對於單行內容會起什麼​​作用? – Literat 2011-02-25 22:49:53

+0

啊所以單行工作的任何地方 - 這很好 - 我需要改變我的帖子 – Literat 2011-02-25 22:54:44