簡體   English   中英

使用 bash 打印每行的最后 n 個字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM