SED를 사용하여 파일에서 레코드 라인을 선택하는 방법

SED를 사용하여 파일에서 레코드 라인을 선택하는 방법

Apologies... Code that I shared earlier is incorrect, revising...

수정된 질문:

우선 서두르게 되어 사과드리고 싶습니다. 저는 QSHELL을 처음 접하고 이제 막 배우기 시작했습니다.. 하지만 가능한 한 빨리 다음 사항을 제 프로그램에 통합해야 하기 때문에 여러분의 도움이 꼭 필요합니다..

기본적으로 유효하지 않은/특수 문자가 포함된 텍스트 파일이 서버에 업로드되고 내 프로그램이 해당 파일을 처리하기 전에 삭제해야 합니다.

예를 들어 다음 콘텐츠가 포함된 uploadfile.txt가 있습니다.

여기에 이미지 설명을 입력하세요.

특수 문자를 바꾸려면 다음 명령을 사용하면 정상적으로 작동합니다.

sed -e 's/[^a-zA-Z0-9&,-]/ /g' uploadfile.txt > outputfile.txt

  1. a to z소문자(az)
  2. A to Z대문자(AZ)
  3. 0-9
  4. &그리고 상징
  5. ,반점
  6. .기간

그런데 교체하기 전에 보고/통신 목적으로 행을 추출해야 하는데 어떻게 해야 하는지 잘 모르겠고 막히네요... 검색을 시도했지만 여전히 얻을 수 없고 시간이 부족합니다..

그래서 내 질문은,줄 번호 2, 4, 5를 별도의 text.files로 추출하려면 어떻게 해야 합니까?

미리 감사드립니다.

이 문제는 해결되었습니다, 댓글에서 @adminbee가 제안한 대로 다음 명령을 사용했습니다.

sed -n '/[^[:print:]]/p' IFS/MM4R5FLR/S06013/myfile.POL > myfile.pol
도움을 주셔서 감사합니다.

답변1

2단계 접근 방식이 작동하는 경우 먼저 grep잘못된 문자가 포함된 모든 줄을 파일로 추출한 다음 sed명령을 사용하여 실제 교체를 수행할 수 있습니다.

[:print:]귀하의 목적은 특수 문자(예: "인쇄할 수 없는" 문자)를 제거하는 것이므로 열거 문자 대신 POSIX 문자 클래스를 사용해 볼 수 있습니다 (이를 이해 grep하는 경우 sed).

따라서 먼저 사용할 수 있습니다

grep '[^[:print:]]' uploadfile.txt > invalid_lines.txt

보관 목적으로 잘못된 문자가 포함된 모든 줄을 추출한 후 실행합니다.

sed -e 's/[^[:print:]]/ /g' uploadfile.txt > outputfile.txt

또는 확실하다면 다음을 통해 내부 편집을 수행하세요.

sed -i -e 's/[^[:print:]]/ /g' uploadfile.txt

파일에서 해당 내용을 지웁니다.

답변2

~에서sed 문서("텍스트 일치로 행 선택"), 유사하게 행을 선택할 수 있습니다.

# First, report lines
sed -n '/[^a-zA-Z0-9&,-]/p' uploadfile.txt > reportfile.txt

# Then, correct and output text
sed -e 's/[^a-zA-Z0-9&,-]/ /g' uploadfile.txt > outputfile.txt

여기서 이 -n옵션은 "p" 명령이 인쇄하는 내용, 즉 정규 표현식에서 선택한 전체 줄만 출력합니다.

관련 정보