从特定列中删除单词(字母后跟空格)

从特定列中删除单词(字母后跟空格)

我有一个文件,格式如下:

cat dog AHF123432 | 123432 | dhfshfjdh
lion  AFG23412 |23412 | dfshjhfjdhj

我需要从第一列中删除那些仅包含字母的单词,即第一行中的猫(后跟空格)和狗以及第二行中的狮子

我的输出将类似于:

AHF123432 | 123432 |  dhfshfjdh    
AFG23412 | 23412 | dhfshfjdh

答案1

这将从行开头删除所有纯字母单词:

$ sed -r 's/^([[:alpha:]]* )*//' filename.tsv
AHF123432 | 123432 | dhfshfjdh
AFG23412 |23412 | dfshjhfjdhj

或者,将输出保存在新文件中:

sed -r 's/^([[:alpha:]]* )*//' filename.tsv > final.tsv

怎么运行的

  • [[:alpha:]]*匹配任意数量的字母字符,后跟一个空格。换句话说,它匹配一个单词后跟一个空格。

    更详细地说,[[:alpha:]]匹配单个字母字符。 ``[[:alpha:]]*` 匹配任意数量的此类字符。

  • ([[:alpha:]]* )*匹配任意数量的此类单词,后跟空格。

  • ^([[:alpha:]]* )*匹配任意数量的后跟空格的单词,但由于^,只能从行首开始。

  • 替换命令删除所有匹配的单词。替换命令的形式s/old/new/如下,这里old是我们上面的表达式,它匹配从行开头开始的任意数量的单词。我们想将这些单词替换为空,因此在这里,我们使用空字符串new

在过去,匹配字母字符的正则表达式是[a-zA-Z].使用现代 unicode 字体,现在更加可靠。因为我们上面的正则表达式使用[:alpha:],所以它是 unicode 安全的。

答案2

如果您grep支持perlc兼容的r常规e表达式:

grep -Po '^([a-z]* +)*\K.*'

或者

pcregrep -o '^([a-z]* +)*\K.*'

答案3

使用awk

awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([a-z]|[A-Z])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo

例子

% cat foo
cat dog AHF123432 | 123432 | dhfshfjdh
lion AFG23412 | 23412 | dfshjhfjdh

% awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([a-z]|[A-Z])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo
AHF123432 | 123432 | dhfshfjdh
AFG23412 | 23412 | dfshjhfjdh

相关内容