単一のコマンドラインを使用して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

関連情報