여러 패턴을 대괄호로 바꾸고 다른 패턴을 탭으로 바꿉니다.

여러 패턴을 대괄호로 바꾸고 다른 패턴을 탭으로 바꿉니다.

다음 줄이 포함된 텍스트 파일이 있습니다.

[...]
GFX Clocks and Power:
    800 MHz (MCLK)
    26 MHz (SCLK)
[...]

일부(값이 일정하지 않음)를 추출하고 싶어서 제거 하고 사용하고 800 MHz싶습니다 .\t(MCLK)sed

이것은 내 현재 명령입니다.

$ cat ~/test.txt | grep "(MCLK)" | xargs -0 sed -i -e $'s/\t//g' -e 's/\(MCLK\)//g'

실행 시 다음을 반환합니다.

sed: can't read     800 MHz (MCLK)
: No such file or directory

이것은 개행 오류도 아니고 \t비표준 문자에 대한 문제 도 아닌 것 같습니다 sed(참조.간단한 sed 탭 교체가 이상하게 실패함)을 수정해야 합니다.

무엇이 문제일까요?

답변1

당신이 가지고 있다면 pgrep:

grep -Po '[0-9]+ [KMGT]?Hz(?= \(MCLK\))' test.txt

답변2

xargs입력을 가져와서 주어진 명령에 대한 인수로 변환합니다. grep관심 있는 줄을 반환하고 파일 이름을 기대하는 명령 xargs에 해당 줄을 인수로 추가합니다 . 전혀 그럴 필요가 없습니다 sed.xargs

sed패턴과 일치하는 행에서만 작동 하도록 지정할 수 있습니다 .

sed -i~ -e '/(MCLK)/{s/\t//g' -e 's/(MCLK)//g}' ~/test.txt

답변3

이 시도,

sed '/(MCLK)/ s/(MCLK)//g;s/\t//' test.txt
800 MHz 
  • /(MCLK)/키워드가 검색됩니다.
  • s/(MCLK)//g삭제됩니다 (MCLK).
  • s/\t//탭이 삭제됩니다.

-i인라인 편집에 옵션을 사용할 수 있습니다 .

편집된 질문에,

awk -F '[$\t ]' '/(MCLK)/ {print $2" "$3}' test.txt
800 MHz

답변4

다음 명령을 사용해보십시오. 잘 작동합니다.

주문하다

sed -n '/MCLK/p' filename| sed -r "s/^\s+//g"| sed -r "s/\(MCLK\)//g"

산출

sed -n '/MCLK/p' filename| sed -r "s/^\s+//g"| sed -r "s/\(MCLK\)//g"

800 MHz 

관련 정보