[英]Print the last n characters of each line using bash
我有一个文件列表,每个文件都包含在自己的行中。 每个文件名的长度为n
,但每个文件的最后 7 个字符是特定标识符。 我想弄清楚如何删除每行最后 7 个字符之前的所有字符。 我认为使用 sed 命令可以做到这一点,并对谷歌和 sed 手册页进行了研究。 但是,我只找到了显示如何格式化 sed 以删除每行中的最后n
字符的资源,这样做是这样的:
sed 's/.\{n\}$//'
我对 bash 还很陌生,找不到有效的资源来了解如何格式化 sed 命令。 有谁知道如何更改此命令以仅打印每行的最后 7 个字符。
如果文件名像 file1, file2, file3......filen 那么使用
sed -i 's,.*\(.\{7\}\)$,\1,' file*
或者
for i in file*; do
sed -i 's,.*\(.\{7\}\)$,\1,' $i
done
但使用-i 时要小心。 它在输入文件中进行更改。
没有sed
,你可以使用cut
:
cut -c -7 file
或使用awk
:
awk '{print (substr($0,length($0)-7+1))}' file
使用这个 Perl one-liner,它利用了substr
。
首先,创建用于测试的输入:
cat > in_file <<EOF
foo_bar_1234567
1234567
123456
EOF
打印in_file
每个字符串中的最后 7 个字符:
perl -lpe '$_ = substr $_, -7;' in_file > out_file
输出:
1234567
1234567
123456
请注意,如果输入少于 7 个字符,它只会打印可用的字符数。 例如,对于 6 个字符,它只打印 6,对于空字符串输入,它打印空字符串。
Perl 单行使用这些命令行标志:
-e
:告诉 Perl 查找内嵌代码,而不是在文件中。
-p
:一次循环输入一行,默认情况下将其分配给$_
。 在每次循环迭代后添加print $_
。
-l
:在执行内联代码之前去除输入行分隔符(默认情况下 *NIX 上的"\\n"
),并在打印时附加它。
使用 sed 提取每行的最后 n 个字符:
sed -n 's/.*\(.\{n\}$\)/\1/p'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.