在 shell 脚本中,有没有办法只对列表重新编号,而不对列表中的内容重新编号?例如:
3. cat
1. hat
2. mouse
并将其更改为:
1. cat
2. hat
3. mouse
谢谢。
答案1
简单地:
awk '$1=NR "."'
这会将第一个字段(空格之前的第一个文本)更改为行(记录)号和一个点。由于记录号始终为正且大于 0,因此赋值结果将始终为 true,导致打印行(记录)时第一个字段发生更改。
当第一个字段发生更改时,将重新计算 NF(字段数)和零字段 ($0),将所有重复的空白转换为一个空格。
也就是说:具有多个相邻空格(和制表符)的行合并为一个空格。
如果需要从 awk 处理中回收多个空格,它会变得更加复杂(只有 GNU awk 有 patsplit):
awk '{
n=patsplit($0,f,/[^ \t\n]+/,s); # split the line storing whitespace.
f[1] = NR "." # only change actually needed.
for(i=0;i<=n;i++) # for all fields (and separators)
{
printf("%s%s",f[i],s[i]) # print each field and separator.
}
print("") # cause the printing of an OFS
}
' patsplitfile
答案2
cut -d. -f2- input | nl -ba -w 1 -s .
这会从输入中去除前导数字和句点,然后将其通过管道传递给nl
,其指示为:
-ba
-- 每行编号-w 1
-- 使用一列来存储插入的数字-s .
-- 用作.
插入的数字和文本之间的分隔符
样本输入:
3. cat
4. some words
1. hat
2. mouse
10. house
9. box
8. fox
7. here
6. there
5. anywhere
输出是:
1. cat
2. some words
3. hat
4. mouse
5. house
6. box
7. fox
8. here
9. there
10. anywhere