首页 > 解决方案 > 如何使用 sed 或 awk 在模式后删除某些字符?

问题描述

我有一个包含如下格式的行数的文本文件

001_A.wav;112.680;115.211;;;Ja. Hello; Hi:

我的目标是清理之后的任何东西;;;。删除以下字符的含义,;()~?

我知道我可以做类似的事情sed 's/[,.;()~?,]//g'。但是,如果我这样做,它会给我类似的东西

001_Awav112.680115211Ja Hello Hi

但是我只想在之后删除这些字符,;;;这样我会得到

001_A.wav;112.680;115.211;;;Ja Hello Hi

我怎样才能完成这项任务?

标签: bashshellawksed

解决方案


第一个解决方案:您能否尝试在 GNU 中使用显示的示例进行跟踪、编写和测试awk(假设;;;在一行中发生一次)。

awk '
match($0,/.*;;;/){
  laterPart=substr($0,RSTART+RLENGTH)
  gsub(/[,.:;()~?]/,"",laterPart)
  print substr($0,RSTART,RLENGTH) laterPart
}'  Input_file

说明:为上述添加详细说明。

awk '                                  ##Starting awk program from here.
match($0,/.*;;;/){                     ##Using atch function to match everything till ;;; here.
  laterPart=substr($0,RSTART+RLENGTH)  ##Creating variable laterPart which has rest of the line apart from matched regex part above.
  gsub(/[,.:;()~?]/,"",laterPart)      ##Globally substituting ,.:;()~? with NULL in laterPart variable.
  print substr($0,RSTART,RLENGTH) laterPart ##Printing sub string of matched regex and laterPart var here.
}' Input_file                          ##Mentioning Input_file name here.


第二种解决方案:如果您多次出现;;;in 行并且您想替换所有字段中的字符,请在第一次出现;;;之后尝试以下操作。

awk 'BEGIN{FS=OFS=";;;"} {for(i=2;i<=NF;i++){gsub(/[,.:;()~?,]/,"",$i)}} 1' Input_file

推荐阅读