我有一个文件,格式如下:
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
支持p
erlc
兼容的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