如果匹配某些模式则添加行号

如果匹配某些模式则添加行号

我有一个文件,我想有选择地添加行号。假设目标字符串以 INIT“command”开头,其中 command 是一个可变文本字符串。我希望它是 INIT“linenumber command”。这个想法是,每个 INIT 行都标有一个唯一的 id,该 id 是有序的,但不一定是连续的。该唯一 id 可以是其行号。如果数字可以是十六进制,那就更好了(当然是虚拟的!)。

编辑:

示例输入

#: ../src/app-utils/business-prefs.scm:24
msgid "Counters"
msgstr ""

示例输出

#: ../src/app-utils/business-prefs.scm:24
msgid "123f>Counters"
msgstr "123f>شمارنده‌ها"

该文件包含数千个这样的信息配对。msgid 和 msgstr 标签匹配,因此必须具有相同的代码。对于下面的代码,我将运行两次并更改内部参数。我认为我必须更改代码中的一些数字以使其适应示例。我添加了“>”,只是为了更容易从实际字符串中识别代码,即一些美化。

答案1

不确定这是否正是您想要的(您尚未提供所要求的示例),但这里尝试使用一个小的 Python 脚本来解决它。它从标准输入读取数据并将其打印到标准输出,在以“INIT”开头的每一行中插入十六进制表示的索引号:

#! /usr/bin/env python3
import sys

i = 0 if len(sys.argv) == 1 else int(sys.argv[1])
while True:
    line = sys.stdin.readline()
    if not line:
        break
    if line.startswith("INIT "):
        print(line[:5] + hex(i)[2:] + line[4:], end="")
        i += 1
    else:
        print(line, end="")

我将上述脚本保存为numberinit.py并使用使其可执行chmod +x numberinit.py

您应该采用以下两种方式之一来运行它:

./numberinit.py < INPUTFILE
./numberinit.py STARTINDEX < INPUTFILE

INPUTFILE是您想要读取的文件,可选STARTINDEX参数允许您指定要使用的第一个索引,默认为 0。

使用示例:

$ cat example.txt 
my input file
INIT first
INIT second
stuff in between
INIT third
INIT something longer as fourth

$ ./numberinit.py < example.txt 
my input file
INIT 0 first
INIT 1 second
stuff in between
INIT 2 third
INIT 3 something longer as fourth

$ ./numberinit.py 42 < example.txt 
my input file
INIT 2a first
INIT 2b second
stuff in between
INIT 2c third
INIT 2d something longer as fourth

当然,您可以重定向命令的输出以将其保存在不同文件中,但不要使用相同的输入和输出文件(由于您的 shell 处理重定向的方式,将会截断文件):

./numberinit.py < input.txt > output.txt

相关内容