첫 번째 필드에 특수 문자만 포함된 행을 삭제하는 방법은 무엇입니까?

첫 번째 필드에 특수 문자만 포함된 행을 삭제하는 방법은 무엇입니까?

첫 번째 구분 필드 에만 /or '또는 -or 을 포함하는 행을 삭제하는 방법은 무엇입니까?.|

  • 시도한 코드:
    sed 's/^\.\d; /^\-/d; /^\//d' file > file_out
    
  • 입력 예:
    /|98374|
    /trust|q83129|
    //|392720|
    //cust|23892|
    .|9374|
    .abcd|28374|
    '|238674|
    'hcsu|3810|
    -|327492|
    -abcde|9837|
    
  • 예상 출력:
    .abcd|28374|
    /trust|q83129|
    //cust|23892|
    'hcsu|3810|
    -abcde|9837|
    

답변1

"Force" 기반 awk솔루션 :)

awk -F'|' '$1 !~ /^[\/'\''.-]+$/' input.txt

그러면 필드 구분 기호가 로 설정되고 |조건이 충족되는 경우에만 인쇄됩니다."첫 번째 필드( ) 는 정규식( ) $1과 일치하지 않습니다. '만 포함하거나, 또는 '( , 적절하게 이스케이프됨)"!~/'.-^[/'.-]+$실현되었습니다.

awk프로그램을 작은따옴표()로 묶어야 하기 때문에 이를 표현하는 구문은 약간 복잡합니다. ' ... '그렇지 않으면 쉘은 해당 명령문 $1에 도달하기 전과 마찬가지로 명령문을 해석합니다 awk. 따라서 문자 목록은 '작은따옴표의 "중단"(첫 번째 것 ), 이스케이프된 리터럴 작은따옴표( \'), 작은따옴표 프로그램의 연속 으로 구성됩니다 awk.

또는 읽기 더 쉬울 수도 있으며, 따옴표 붙은 문자열, 따옴표 붙은 문자열 및 다른 따옴표 붙은 문자열을 연결하여 프로그램을 작성합니다 awk.'...'"..."'...'

awk -F'|' '$1 !~ /^'"[\/'.-]"'+$/' input.txt

답변2

|첫 번째 구분 필드가 집합의 문자로만 구성된 행을 제거하려는 경우 .-/'다음을 수행합니다.

grep -vxE "[./'-]+(\|.*)?"

-v(세트에서 1개 이상의 ( ) 문자 시퀀스 -x, 그 뒤에 선택적인 ( ), 임의의 숫자 ( ) 문자 ( ) 로 구성된 라인 ( )을 완전히 제거합니다 .)+./'-?|*.

또는

grep -vE "^[./'-]+(\||\$)"

^(( )로 시작하고 set 에서 1개 이상의 ( +) 문자를 포함하고 ./'-그 뒤에 ( |) |또는 줄 끝( 이스케이프 처리된 줄을 제거합니다 $. 이는 여전히 큰따옴표 안의 쉘에 특별하지만 일반적으로 뒤에 오지 않기 때문입니다 ))).

첫 번째 필드가 비어 있는 행도 제거하려면 +로 바꾸세요. *또는 다음을 사용하십시오:

grep "^[^|]*[^|./'-]"

첫 번째 문자 () ^이외의 문자가 하나 이상 포함된 행을 검색합니다../'-|

보다 일반적으로는 (and -> ) sed /regexp/d로 작성할 수 있습니다 . 더 작고 일반적으로 더 빠르다는 점 외에도 확장 정규 표현식을 이식할 수 있다는 장점이 있습니다. 그러나 모든 구현이 그렇지 는 않습니다 . 정규식을 지원하는 구현보다 정규식을 지원하는 구현이 더 많습니다.grep -v regexpsed '/re1/d; /re2/d'grep -v -e re1 -e re2grepsedsed-Egrep-Pperlsed

답변3

당신은 무엇을 기대 합니까 s/^\.\d? 대체 명령을 열었 s지만 실수로 다른 슬래시로 닫았습니다. /^\./d점이 있는 선을 삭제 하고 싶을 수도 있지만 이렇게 하면 해당 .abcd선도 삭제됩니다.

./'-그러나 실제로는 앞에 있는 문자 외에는 문자가 없는 줄을 제거하려는 것 같습니다 |. 따라서 이것을 정규식에 넣으십시오.

sed "/^[./'-]*|/d" < file > file_out

원하는 출력대로 인쇄 라인을 재정렬하지는 않지만 재정렬 방법을 지정하지 않았습니다.

그리고 귀하의 예에서는 빈 첫 번째 필드를 처리하는 방법을 보여주지 않습니다. 이것을 인쇄해야 하는 경우 다음을 사용하십시오.

sed "/^[./'-]\{1,\}|/d" < file > file_out

답변4

awk -F '|' "\$1 ~ /[^-./']|^$/" file

관련 정보