如何使用单个命令行删除与 unix txt 文件中特定模式匹配的整个字符串

如何使用单个命令行删除与 unix txt 文件中特定模式匹配的整个字符串

我想删除所有包含“vcc”的字符串。

例子:

    s_regscan_ctrl_lab_2_regscan_ce[0] s_regscan_data_l_regscan s_t_regscan_data_tieoff_regscan vcc_cram_viort1_6_t 
 vcc_cram_viort1_7_t vcc_cram_viort1_8_t vcc_cram_viort1_9_t vcc_cram_vioxio1_0_t 
 vcc_cram_vioxio1_1_t vcc_cram_vioxio1_2_t vcc_cram_vioxio2_0_t vcc_cram_vioxio2_1_t 
 vcc_cram_vioxio2_2_t vcchg vccl vssgnd m_b_regscan_data_tieoff_regscan

预期输出:

    s_regscan_ctrl_lab_2_regscan_ce[0] s_regscan_data_l_regscan s_t_regscan_data_tieoff_regscan vssgnd m_b_regscan_data_tieoff_regscan

我尝试过:

cat abc.txt | sed 's/\svcc.*\s//g'"

但它删除了 vcc* 之后的所有内容并返回:

s_regscan_ctrl_lab_2_regscan_ce[0] s_regscan_data_l_regscan s_t_regscan_data_tieoff_regscan

有人可以帮忙吗?

答案1

自从你标记了

$ cat abc.txt
    s_regscan_ctrl_lab_2_regscan_ce[0] s_regscan_data_l_regscan s_t_regscan_data_tieoff_regscan vcc_cram_viort1_6_t
 vcc_cram_viort1_7_t vcc_cram_viort1_8_t vcc_cram_viort1_9_t vcc_cram_vioxio1_0_t
 vcc_cram_vioxio1_1_t vcc_cram_vioxio1_2_t vcc_cram_vioxio2_0_t vcc_cram_vioxio2_1_t
 vcc_cram_vioxio2_2_t vcchg vccl vssgnd m_b_regscan_data_tieoff_regscan

如果我们remove_vcc.tcl

#!/usr/bin/env tclsh
set fid [open [lindex $argv 0] r]
while {[gets $fid line] != -1} {
  set words [split $line]
  set filtered [lmap word $words {
    if {[string match {*vcc*} $word]} then continue else {string cat $word}
  }]
  set newline [join $filtered]
  if {[string trim $newline] ne ""} {
    puts $newline
  }
}
close $fid

然后

$ tclsh remove_vcc.tcl abc.txt
    s_regscan_ctrl_lab_2_regscan_ce[0] s_regscan_data_l_regscan s_t_regscan_data_tieoff_regscan
 vssgnd m_b_regscan_data_tieoff_regscan

答案2

我不确定你想如何继续,但我会尽力。

如果您想删除文本文件中出现的每个字符串vcc(请注意,您不需要使用cat

sed 's/vcc//g' abc.txt

使用命令-i上的开关sed将修改写入文件中。

如果您想删除包含以下内容的所有行vcc

grep -v "vcc" abc.txt

如果你想删除每个单词(我的意思是这里用空格分隔的字符串):

sed 's/\b\w*vcc\w*\b//g' abc.txt

答案3

我会使用这个简单的awk单行:

cat abc.txt | awk -v RS=" " '!/vcc/ {print $0}'

或者从你的例子来看,我的猜测是你想删除它,vcc如果它在开始,而不是仅仅将它包含在某个地方,所以我宁愿使用这个:

cat abc.txt | awk -v RS=" " '!/^vcc/ {print $0}'

答案4

使用awk

$ awk '{for(i=1;i<=NF;i++)  printf "%s", ($i ~ /vcc/) ? "" :  $i OFS}END{print ""}' file

相关内容