删除文件行中的最后 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_part”:

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

相关内容