Bash 将编号放在每个匹配的字符串模式之前

Bash 将编号放在每个匹配的字符串模式之前,bash,shell,sed,Bash,Shell,Sed,我需要替换这个: 01:05:01:11 --> 01:05:04:07,so you may continue to support us,|bring us health, $Italic = True 01:05:04:15 --> 01:05:07:09,well-being, $Italic = False 01:05:07:21 --> 01:05:13:01,and help us to be one big family|and continue working

我需要替换这个:

01:05:01:11 --> 01:05:04:07,so you may continue to support us,|bring us health,
$Italic = True
01:05:04:15 --> 01:05:07:09,well-being,
$Italic = False
01:05:07:21 --> 01:05:13:01,and help us to be one big family|and continue working as a team.
从本质上说,这是:

1
01:05:01:11 --> 01:05:04:07,so you may continue to support us,|bring us health,
$Italic = True
2
01:05:04:15 --> 01:05:07:09,well-being,
$Italic = False
3
01:05:07:21 --> 01:05:13:01,and help us to be one big family|and continue working as a team.
编辑\u 1:这意味着我需要匹配:

' --> '
并计算其发生次数

编辑_2:因此,例如,我只需要匹配包含以下内容的行:

01:05:04:15 --> 01:05:07:09,
在每一行之前,我需要将前面提到的例子的出现次数插入到文件中

我提出了这个简短的Shell脚本,它使用了“sed”命令,但是处理一个稍大的文件(例如,超过60行)需要很长时间

#定义特殊字符的数量-以便计算字幕行的数量
特殊字符号=“$(grep-o'-->”输出文件| wc-l)”
#在每个副标题行之前添加编号

对于((i=1;i您的问题不太清楚,看到您预期的输出,遵循awk可能也会对您有所帮助。(我有旧的
awk
,因此在最近的
awk
中添加
re interval
,可以将其删除。)我假设您希望在一行上查找特定的字符串并打印其行号

awk --re-interval '/[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}/{print FNR ORS $0}'  Input_file
如果要在一行之前添加计数,请将上述代码中的
ORS
更改为
OFS

若您需要将输出保存在您的输入文件中,则以下内容也可能对您有所帮助

awk --re-interval '/[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}/{print FNR ORS $0}'  Input_file > temp_file && mv temp_file  Input_file
编辑:如果您只想在每行之前打印行号,则以下内容可能会对您有所帮助

awk '{print FNR ORS $0 ORS}'  Input_file

您的问题不太清楚,看到您预期的输出,遵循awk可能也会对您有所帮助。(我有旧的
awk
,因此在最近的
awk
中添加
re interval
,可以将其删除。)我假设您希望查看行上的特定字符串并打印其行号

awk --re-interval '/[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}/{print FNR ORS $0}'  Input_file
如果要在一行之前添加计数,请将上述代码中的
ORS
更改为
OFS

若您需要将输出保存在您的输入文件中,则以下内容也可能对您有所帮助

awk --re-interval '/[0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{2}/{print FNR ORS $0}'  Input_file > temp_file && mv temp_file  Input_file
编辑:如果您只想在每行之前打印行号,则以下内容可能会对您有所帮助

awk '{print FNR ORS $0 ORS}'  Input_file

sed
在使用算术和

  • /-->/
    如果行与此REGEXP匹配
    • $0=++i RS$0
      为输入记录添加行号前缀,并使用默认为换行的
      RS
      值将它们分开
    • i
      变量将获得
      0
      作为数值上下文中的默认值,
      ++i
      将在每一行匹配给定的REGEXP时提供递增的值
  • 1
    打印输入记录内容的惯用方法
    $0
  • 另见

您还可以使用
perl

# use perl -i -pe for inplace editing
perl -pe 's/^/++$i . "\n"/e if /-->/' ip.txt
# or, borrowing Ed Morton's simplicity
perl -lpe 'print ++$i if /-->/' ip.txt

sed
在使用算术和

  • /-->/
    如果行与此REGEXP匹配
    • $0=++i RS$0
      为输入记录添加行号前缀,并使用默认为换行的
      RS
      值将它们分开
    • i
      变量将获得
      0
      作为数值上下文中的默认值,
      ++i
      将在每一行匹配给定的REGEXP时提供递增的值
  • 1
    打印输入记录内容的惯用方法
    $0
  • 另见

您还可以使用
perl

# use perl -i -pe for inplace editing
perl -pe 's/^/++$i . "\n"/e if /-->/' ip.txt
# or, borrowing Ed Morton's simplicity
perl -lpe 'print ++$i if /-->/' ip.txt
这可能适用于您(GNU-sed):

遇到字符串
-->
时,交换到保留空间(HS)并用
替换任何尾随的
9
。如果这是第一次或所有字符都是
,则添加一个
0
。增加最后一个数字,然后用
0
替换所有
并打印计数器和当前行。删除当前行,使计数器为下一次匹配准备就绪,然后返回到PS。最后删除PS。对于不匹配的行,按正常方式打印。

这可能适用于您(GNU-sed):


遇到字符串
-->
时,交换到保留空间(HS)并用
替换任何尾随的
9
。如果这是第一次或所有字符都是
,则添加一个
0
。增加最后一个数字,然后用
0
替换所有
然后打印计数器和当前行。删除当前行,让计数器为下一次匹配准备就绪,然后返回到PS。最后删除PS。对于不匹配的行,请按正常方式打印。

抱歉,我需要修改输入字符串-每行后面都有一行新行。因此,当我使用代码时,输出为:
1 01:05:01:11-->01:05:04:07,所以你可以继续支持我们,给我们带来健康,2 3 01:05:04:15-->01:05:07:09,幸福,4 5 01:05:07:21-->01:05:13:01,帮助我们成为一个大家庭,继续作为一个团队工作。6
它又增加了一个数字-这不是期望的输出。请编辑您的帖子并添加示例输入和输出在代码标记中。是的,我这样做了。我对StackOverflow有点陌生-我想现在很清楚了。如果不是,请告诉我。谢谢你的帮助,Ravinder!你现在应该已经注意到你问题中的示例不适合描述这个问题。@Xtigyro最好添加一些与搜索条件不匹配的行,以便MPE输入/输出本身很好地说明了您需要什么…而且,示例中不需要这么大的行,您可以将其截断。.您尝试的代码尝试匹配数字格式和所有内容,但您的搜索条件是否可以简化为只查找
-->
?抱歉,我需要修改输入字符串-eve之后还有一行新代码因此,当我使用您的代码时,输出是:
1 01:05:01:11-->01:05:04:07,所以您可以继续支持我们,|给我们带来健康,2 3 01:05:04:15-->01:05:07:09,幸福,4 5 01:05:07:21-->01:05:13:01,并帮助我们