刪除檔案行中的最後 n 個字符

刪除檔案行中的最後 n 個字符

我使用的是 Mac 終端機 (bash),並且有一個名為的文件data_list.txt,其中包含n如下行:

aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

如何刪除每行的最後 8 個字元?

預期輸出data_list.txt

aaabbbccc_ 
nnhhaa_ 
ayquabay_ 
ayqynbnbn_ 
ooppaa_

謝謝你的幫助

答案1

如果你想刪除最後 8 個字符,或者如果少於 8 個字符則全部刪除,你可以這樣做:

sed "s/.\{0,8\}$//; /^$/d" data_list.txt

不需要擴展正規表示式。這將清除盡可能多的字符,但不超過 8 個。

如果您需要清除任何尾隨空格(不將其包含在 8 個字元中),您可以執行以下操作:

sed "s/.\{0,8\}[[:space:]]*$//" data_list.txt

我只能猜測最後應該刪除的內容的實際條件是什麼(例如,下劃線之後的所有內容,或數字+擴展名),但是如果您想刪除文件擴展名及其之前的任何數字:

sed "s/[[:digit:]]*\..*$//" data_list.txt

其他答案已經展示瞭如何刪除下劃線之後的所有內容,所以我不再重複。

答案2

對於您的確切輸入(除最後一行外,所有行的末尾都有空格)您可以使用它(我想您想擺脫“after _部分”:

sed 's/........ *$//' data_list.txt

若要刪除最後一個「底線」字元之後的任何內容,請使用以下命令:

sed 's/\(.*_\).*$/\1/' data_list.txt

它也適用於具有多個“下劃線”字元的行,因為 sed 是“貪婪的”。雖然我不知道這是否適用於 MacOS,但至少這對於谷歌搜尋引擎將登陸這裡的功能 Linux sed 用戶很有用...

答案3

這是一個awk與 frippe 的方法一樣快速的解決方案sed,使用包含 100,000 行的範例檔案:

time awk '{print substr($0, 1, length($0)-8)}' 100k.txt

real    0m4.110s
user    0m0.142s
sys     0m0.422s

time sed "s/.\{0,8\}$//; /^$/d" 100k.txt

real    0m4.043s
user    0m1.558s
sys     0m0.345s

替換8為任意數字。這裡的主要區別是,awk如果您的修剪長度超過行長度,則會列印換行符,而sed不會。

答案4

使用 Raku(以前稱為 Perl_6)

raku -ne '.trim-trailing.chop(8).put;'

或者

raku -pe '.=trim-trailing; .=chop(8);'

輸入範例:

wxxyyyzzzz_1234.txt
aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

範例輸出:

wxxyyyzzzz_
aaabbbccc_
nnhhaa_
ayquabay_
ayqynbnbn_
ooppaa_

請注意,上面的兩個答案都使用 Raku 的trim-trailing例程來消除尾隨空格。請隨意刪除和/或調整字串右端的 -pedtrim-trailing字元數。chop

https://docs.raku.org/routine/chop
https://raku.org

相關內容