簡體   English   中英

刪除Bash中的特定單詞+符號

[英]Delete specific words + symbol in Bash

我有一個MAC供應商列表,我需要解析文本以刪除不需要的信息。

如果我有這個

F8FEA8 Technico # Technico Japan Corporation
F8FF5F Shenzhen # Shenzhen Communication Technology Co.,Ltd
FC0012 ToshibaS # Toshiba Samsung Storage Technolgoy Korea Corporation
FC019E Vievu
FC01CD Fundacio # FUNDACION TEKNIKER
FC0647 Cortland # Cortland Research, LLC
FC0877 PrentkeR
FC0A81 Motorola # Motorola Solutions Inc.

我需要刪除所有[空格] [單詞] [#]才能擁有此功能

F8FEA8 Technico Japan Corporation
F8FF5F Shenzhen Communication Technology Co.,Ltd
FC0012 Toshiba Samsung Storage Technolgoy Korea Corporation
FC019E Vievu
FC01CD FUNDACION TEKNIKER
FC0647 Cortland Research, LLC
FC0877 PrentkeR
FC0A81 Motorola Solutions Inc.

可以使用grepsed嗎? :S

對不起,我的英語不好

這是僅外殼程序的解決方案:

while read A B C D;do
  [ "$C" == "#" ] && echo "$A $D" || echo "$A $B $C $D"
done < infile.txt >outfile.txt

這可能對您有用(GNU sed):

sed -ri 's/\s\S+\s#//' file

要么:

sed -i 's/ [^ ][^ ]* #//' file

這意味着:查找一個空格,然后是一個或多個非空格,然后是另一個空格,再是# ,然后刪除該表達式。 該文件已更新到位,這就是-i選項的含義。第一個解決方案中的-r選項允許使用syntatic sugar ,在這種情況下,允許您編寫\\S+而不是\\S\\+[^ ][^ ]*

這似乎很容易解析。 這里是使用的解決方案。 它將行分隔為基於空白的字段,如果第三個為#則將其刪除,將前一個刪除:

perl -lane 'if ( $F[2] eq q|#| ) { @F = @F[0,3..$#F] }; print qq|@F|' infile

它產生:

F8FEA8 Technico Japan Corporation
F8FF5F Shenzhen Communication Technology Co.,Ltd
FC0012 Toshiba Samsung Storage Technolgoy Korea Corporation
FC019E Vievu
FC01CD FUNDACION TEKNIKER
FC0647 Cortland Research, LLC
FC0877 PrentkeR
FC0A81 Motorola Solutions Inc.

假設#出現時#在字段3中自立,則以下解決方案可能有效

awk '$3 == "#"{t=$1; $1=$2=$3=""; sub(/^[[:space:]]+/, ""); $0=t" "$0}; 
     {print}' file.txt

更多awk

awk -F" # [^ ]+ " '{$1=$1}1' file # more robust
awk -F" # [^ ]+ " '$1=$1' file    # some dangerous, do not use if $1=0

這會將字段分隔符設置為等於我們要刪除的內容,然后打印其余內容。

awk '{sub(/ # [^ ]+/,x)}1' file

這只是刪除了我們不需要的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM