UNIX Bash:为具有特定格式的文件的每一行编号

时间:2017-01-09 11:57:07

标签: bash unix

我正在尝试使用以下格式为文件的每一行编号:/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命令提供特定格式吗?

2 个答案:

答案 0 :(得分:4)

使用printf中的Awk功能,整数部分周围包含/个字符。

awk '{printf("/%d/ %s\n", NR, $0)}' file
/1/ UK
/2/ Australia
/3/ Newzealand
/4/ Brazil
/5/ America

NRawk中的一个特殊变量,用于跟踪处理过的每一行的记录编号,并且该行为$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),后跟一个空格。

请参阅:The Stack Overflow Regular Expressions FAQ