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