次の形式のファイルがあります。
cat dog AHF123432 | 123432 | dhfshfjdh
lion AFG23412 |23412 | dfshjhfjdhj
最初の列から文字のみを含む単語(たとえば、最初の行の猫(後ろのスペース)と犬、2番目の行のライオン)を削除する必要があります。
私の結果は次のようになります。
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
erl互換正規表現をgrep
サポートする場合:p
c
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