SED 또는 AWK를 사용하여 txt 파일에서 특정 숫자를 제거하는 방법은 무엇입니까?

SED 또는 AWK를 사용하여 txt 파일에서 특정 숫자를 제거하는 방법은 무엇입니까?

저는 컴퓨터에 어떤 소프트웨어도 설치할 수 없는 회사에 근무하고 있는데, 그곳에서 사용하는 Windows는 형편없습니다.

인트라넷에서 복사한 많은 텍스트를 정리해서 txt 파일로 저장해야 합니다. 그래서 저는 sed다음과 awk같은 온라인 라이브 편집기를 사용해야 합니다 .이것또는이것

이 말은 이렇습니다.

01

010010-26.2010.501.0026  fafas fasdf asdf asdfsadf asdfasd fasd asasdff

fdfsadf adsf adsf asdf asdfas fadsf asdfa

02

0011-15.2016.501.0012  fafas fasdf asdf asdfsadf asdfasd fasd asasdff
asdfasd fasd asasdff
asdfasd fasd asasdff
0011-125.2013.501.0012
asdfasd fasd asasdff

이런 숫자를 보는 것이 0011-15.2016.501.0012내가 원하는 것입니다. 나머지는 신경쓰지 않지만 이 모든 숫자를 한 줄에 하나씩 포함하여 깨끗한 새 텍스트를 만들고 싶습니다. 이전 예에서는 텍스트가 필요했습니다.

010010-26.2010.501.0026
0011-15.2016.501.0012
0011-125.2013.501.0012

모든 숫자에서 는 .501.항상 네 번째 그룹으로 나타납니다.

sed 온라인 편집기에서 이 명령을 시도했습니다.

's/\([0-9]*\-[0-9]*\.[0-9]*\.501\.[0-9]*\)/\1/'

작동 안함.

답변1

작동하지만 아무 것도 변경하지 않거나 원래대로 변경합니다. 하지만 이 코드를 조금만 수정하면 원하는 것을 얻을 수 있습니다.

sed -n 's/\([0-9]*\-[0-9]*\.[0-9]*\.501\.[0-9]*\).*/\1/p'

세 가지 사항에 주의하세요.

  • -n스위치는 기본적으로 아무것도 인쇄하지 않음을 의미합니다.
  • .*선택한 그룹의 끝에서(...)
  • p마지막 명령은 이 줄을 인쇄한다는 뜻입니다.

결과:

010010-26.2010.501.0026
0011-15.2016.501.0012
0011-125.2013.501.0012

그런데, 확장 정규 표현식을 추가하고 사용하면 조금 단순화할 수 있습니다 -E. 즉, 캡처 그룹 앞의 백슬래시를 제거하면 됩니다.

sed -E -n 's/([0-9]*-[0-9]*\.[0-9]*\.501\.[0-9]*).*/\1/p'

위의 웹페이지에서는 두 가지 방법 모두 작동합니다.

답변2

AWK를 사용하는 것은 매우 간단합니다. b/c는 일반적으로 AWK가 아무 작업도 수행하지 않으므로 언제 수행해야 하는지 알려주기만 하면 됩니다. 즉, ID가 존재하는 경우 줄 시작 부분에 ID를 인쇄하는 것입니다.

/^[0-9]+-[0-9]+\.[0-9]+\.501\.[0-9]+/{
    print $1
}

sed와는 약간 다릅니다. b/c 기본적으로 sed는 모든 것을 인쇄합니다. (적어도 이 도구가 저에게는 그렇게 작동합니다.) 먼저 기본 동작을 아무것도 하지 않도록 변경 sed하려면 as 를 호출해야 합니다. sed -n그럼 우리는 할 수 있어

s/^\([0-9]\+-[0-9]\+\.[0-9]\+\.501\.[0-9]\+\).*$/\1/p

p마지막에 sed에게 말해야 합니다일치하는 패턴이 있으면 결과가 인쇄됩니다. 귀하의 특정 sed 표현은 다음과 같습니다아니요모든 일치 항목을 자체적으로 대체하고 다른 모든 항목을 있는 그대로 인쇄하기 때문입니다.

관련 정보