다음 형식의 파일이 있습니다.
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]
. 최신 유니코드 글꼴에서는 이것이 더 안정적입니다. 위에서 사용한 정규식은 [:alpha:]
유니코드에 안전하기 때문입니다.
답변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