我在 VIM 中有一个非常有用的 sed 命令,我想将其放入一个简单的 bash 脚本中。 但我已经尝试了它的许多变体(疯狂地用谷歌搜索)但它不起作用......
在 VIM 中工作的 sed 字符串是: %s/( )[0-9]{8}$/=printf(' %08d', line('.'))/g
我尝试过
sed -i "s/\( \)[0-9]\{8\}$/\=printf(' %08d', line('.'))/g"
和几种变体。
我想更改一行中的最后 8 位数字(行的长度不同,但总是以空格和 8 位数字结尾。有时我需要删除和删除行,因此需要更改序列号(行号) :
另外,我使用相同的 VIM sed 命令来更改单词,这样我就可以使用行号。
示例:%s/LINENUMB/=printf('%08d', line('.'))/g
这里我想将单词
LINENUMB
更改为实际的8位行号。
在 VIM 中工作,但我无法使其在终端或脚本中工作。
请帮忙
示例 1,我删除了行
00000002
现在我需要更改序列号....
321321321321321321321321321321321321321321321321321321 00000001
6546546546546546546546546546546546546546546546546546546546546546 00000003
987987987987987987987987987987987987987987987987987987987 00000004
预期结果:
321321321321321321321321321321321321321321321321321321 00000001
6546546546546546546546546546546546546546546546546546546546546546 00000002
987987987987987987987987987987987987987987987987987987987 00000003
示例 2,我想将
LINENUMB
更改为实际行号...假设它位于文件中的 00206206
行中
987654321LINENUMB123456789
预期结果
98765432100206206123456789
假设:
LINENUMB
)LINENUMB
在一行中出现多次,则每次出现都会被替换为相同的行号00000001
样本数据:
$ cat raw.dat
321321321321321321321321321321321321321321321321321321 00000001
654654654XLINENUMBX546546546546546546546546546546546546546546546 00000003
^^^^^^^^ ^^^^^^^^
98798XLINENUMBX9879879879879879XLINENUMBX7987987987987987 00000004
^^^^^^^^ ^^^^^^^^ ^^^^^^^^
注意: 文件不包含
^^^^^
行;提供这些行是为了在视觉上突出显示感兴趣的字符串
一个
awk
想法:
awk '
{ lineno = sprintf("%08d",FNR) } # left pad current line number (FNR) with zeros
/LINENUMB/ { gsub(/LINENUMB/,lineno) } # replace all strings "LINENUMB" with our zero-padded line number
$NF+0 != FNR { $NF = lineno } # if last field is not same as current line number then update the field
1 # print current line to stdout
' raw.dat
这会生成:
321321321321321321321321321321321321321321321321321321 00000001
654654654X00000002X546546546546546546546546546546546546546546546 00000002
^^^^^^^^ ^^^^^^^^
98798X00000003X9879879879879879X00000003X7987987987987987 00000003
^^^^^^^^ ^^^^^^^^ ^^^^^^^^