如何更改 VIM sed 命令以在 bash 脚本中工作?

问题描述 投票:0回答:1

我在 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
bash awk sed vim printf
1个回答
0
投票

假设:

  • 一个文件可能包含这两种情况(最后一个字段中的 8 位序列号;该行中的文字字符串
    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
      ^^^^^^^^                  ^^^^^^^^                  ^^^^^^^^
© www.soinside.com 2019 - 2024. All rights reserved.