我正在尝试使用以下格式为文件的每一行编号:/1/
,/2/
,...
例如
这
UK
Australia
Newzealand
Brazil
America
要
/1/ UK
/2/ Australia
/3/ Newzealand
/4/ Brazil
/5/ America
我想到
grep -n file.txt // but the format is 1: , 2: , ...
nl file.txt // but the format is 1 , 2 , 3
我可以为nl
命令提供特定格式吗?
答案 0 :(得分:4)
使用printf
中的Awk
功能,整数部分周围包含/
个字符。
awk '{printf("/%d/ %s\n", NR, $0)}' file
/1/ UK
/2/ Australia
/3/ Newzealand
/4/ Brazil
/5/ America
NR
是awk
中的一个特殊变量,用于跟踪处理过的每一行的记录编号,并且该行为$0
。上述命令与POSIX
兼容,因为所有主要平台中的awk
都支持printf
格式说明符。
在没有任何第三方工具的情况下,单独使用bash
的正确方法。
#!/bin/bash
count=1
while IFS= read -r line
do
printf "/%d/ %s\n" "$count" "$line"
((count++))
done <input-file
AFAIK,来自man nl
页面,您可以使用选项,但无用于包围您想要的字符周围的行号,您当然可以使用它的一面,-s
标志
我能做的最接近的是,
nl -nrz -s/ -w1 file
1/UK
2/Australia
3/Newzealand
4/Brazil
5/America
此处,-nrz
用于右对齐,-s
用于在编号完成后使用的特殊字符。在这种情况下,我添加了/
和-w
来控制编号部分的宽度。
答案 1 :(得分:2)
使用GNU cat和GNU sed:
cat -n file | sed 's|^ *|/|;s|\t|/ |'
输出:
/1/ UK /2/ Australia /3/ Newzealand /4/ Brazil /5/ America
我使用了两种s
命令,格式为:s|regexp|replacement|
。
的零个或多个(
s|^ *|/|
:这会以^
*
)空格开头(/
)替换
s|\t|/ |
:这将用一个斜杠替换一个标签(\t
),后跟一个空格。