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,并帮助我们