删除Bash中的特定单词+符号

时间:2013-09-28 23:31:12

标签: bash sed awk grep

我有一个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.

是否可以使用 grep sed 来完成? :S

抱歉我的英文不好

5 个答案:

答案 0 :(得分:4)

以下是仅限shell的解决方案:

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

答案 1 :(得分:4)

这可能适合你(GNU sed):

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

或:

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

这意味着:查找一个空格,后跟一个或多个非空格,后跟另一个空格,后跟#,然后删除该表达式。该文件已就地更新,这是-i选项的含义。第一个解决方案中的-r选项允许使用syntatic sugar,在这种情况下允许您编写\S+ 1}}而不是\S\+[^ ][^ ]*

答案 2 :(得分:2)

这似乎很容易解析。这是使用的解决方案。它在基于空格的字段中拆分线,如果第三个是#,则删除它和前一个:

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 :(得分:2)

假设#在字段3中出现时自立,可以使用以下解决方案

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

答案 4 :(得分:2)

更多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

这只是删除我们不想要的东西。