我想删除所有包含“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
自从你标记了tcl
$ 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