bash - 如何使用 sed 或 awk 在模式后删除某些字符?

标签 bash shell awk sed

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

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
我怎样才能完成这个任务?

最佳答案

第一个解决方案:您能否尝试在 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.

第二种解决方案:如果您多次出现 ;;;在行中,并且您想在第一次出现 ;;; 后替换所有字段中的字符然后尝试跟随。
awk 'BEGIN{FS=OFS=";;;"} {for(i=2;i<=NF;i++){gsub(/[,.:;()~?,]/,"",$i)}} 1' Input_file

关于bash - 如何使用 sed 或 awk 在模式后删除某些字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64902206/

相关文章:

c - Mac OSX - 启动 Shell 和工作目录

linux - 如何从 Linux shell 运行具有与当前不同工作目录的程序?

bash - 更改 sed 中许多文件的最后一行 - sed 仅更改第一行

linux - 使用 awk 或 sed 对以模式开头的行进行排序

将行转列的 Linux 脚本

RMarkdown : How to pass arguments to bash chunk defined as variables in R?

bash - 使用 tar - --listed-incremental -g 创建增量备份

bash - 如何在终端中执行 bash 脚本?

linux - 在 printf 中使用颜色

C代码Makefile,如何包含路径?