첫 번째 구분 필드 에만 /
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 regexp
sed '/re1/d; /re2/d'
grep -v -e re1 -e re2
grep
sed
sed
-E
grep
-P
perl
sed
답변3
당신은 무엇을 기대 합니까 s/^\.\d
? 대체 명령을 열었 s
지만 실수로 다른 슬래시로 닫았습니다. /^\./d
점이 있는 선을 삭제 하고 싶을 수도 있지만 이렇게 하면 해당 .abcd
선도 삭제됩니다.
./'-
그러나 실제로는 앞에 있는 문자 외에는 문자가 없는 줄을 제거하려는 것 같습니다 |
. 따라서 이것을 정규식에 넣으십시오.
sed "/^[./'-]*|/d" < file > file_out
원하는 출력대로 인쇄 라인을 재정렬하지는 않지만 재정렬 방법을 지정하지 않았습니다.
그리고 귀하의 예에서는 빈 첫 번째 필드를 처리하는 방법을 보여주지 않습니다. 이것을 인쇄해야 하는 경우 다음을 사용하십시오.
sed "/^[./'-]\{1,\}|/d" < file > file_out
답변4
awk -F '|' "\$1 ~ /[^-./']|^$/" file