2016-09-19 8 views
0

이 코드 나오지 부분 이해 :디코드 나오지 식

/usr/local/bin/pcsensor -l60 -n | sed -e "s/^.*\$/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/" 

(입력)을 pcsensor 생산 : 코드가 생성

2016/09/19 22:41:31 Temperature 90.50F 32.50C 

(출력)

PUTVAL downloads/exec-environmental/temperature-cpu interval=30 N:32.50 

sed 표현을 이해하면 마지막 자리를 두드리는 데 도움이되기를 바랍니다 (임시 직원이 소수점 1 자리에 불과하므로) .

업데이트

: 내 booboo은 (는 늦었다) :

명령 출력의 첫 번째 부분에서 -n이 : 에코에서 잘 작동

32.50 

/printf와

printf "32.50 %s\n"| sed -e "s/^.*\$/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/" 
+1

은 '\ 0'오타해야하지만 분명히 그와 같은 작업을 수행'&'(전체 일치를 반복). 하지만 어디서나 문서화 된 것을 볼 수는 없습니다. –

+0

그런데 사용중인 sed의 버전은 무엇입니까? 이 sed 명령을 사용하여 입력에 대한 출력이 달라집니다. –

+0

어쨌든 나는 말하지 않는다. 나에게 덤벼 들었어. sed (GNU sed) 4.2.2 –

답변

2

소개

sed -e "s/^.*\$/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/" 
,

1 개의 sed 명령, 즉 "대체"에 대한 s/.../.../입니다. 간단히 말하자면, 작업하는 모든 라인에 대해 단일 "검색 및 교체"를 수행합니다.

"검색"부분은 ^.*\$이고 "교체"부분은 PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/입니다.

^.*\$은 단순한 Regular expression이며 여기서 "모든 것"또는 "전체 줄"을 의미합니다. 그래서, s 명령은 벤자민 W. pointed out\0의 사용이 "이상한"있는 그대로

PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:\0/ 

으로 전체 라인을 대체합니다. 분명히 소위 참조로 의미가 있었기 때문에 우리가 검색 한 부분이 "PUTVAL (...) val = 30 N :"텍스트 뒤에 추가되었습니다.

나는 이것이 제시되는 방식에 몇 가지 문제가 있습니다.

  • \0 내 데비안 GNU Sed의 4.2.2의 맨 페이지에 있지 않습니다.
  • sed 명령을 "으로 인용하면 불필요하게 복잡해지며 오류가 발생하기 쉽습니다. 대신 작은 따옴표를 사용해야합니다.
  • \0 쉘과 특히 Sed의 어느 곳에서나 null 문자를 매우 잘 나타낼 수 있습니다. " 따옴표로 인해 더 많은 빨간색 플래그가 발생합니다.
  • sed을 사용하면 텍스트 앞에 "Sed의 쓸모없는 사용"이 표시됩니다. 당신에 대한 sed을 요구하기 때문에

, 여기에 내가에 다음과 같이 쓸 수있다 : "검색 부분을 찾을 것"에 대한

sed -e 's/^.*$/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:&/' 

& 스탠드. 귀하의 경우 전체 라인.

마지막 소수점을 자르기 위해 여러 가지 방법이 있습니다. 오히려 간단한 접근법은 입력에 항상 소수점 2 자리가 있다고 가정합니다. 내가 말했듯이

sed -e 's/.$//;s/^[0-9][0-9]*\.[0-9]/PUTVAL downloads\/exec-environmental\/temperature-cpu interval=30 N:&/' 

그러나, sed이 과잉 여기에 있습니다 : 그럼 우리가 "아무것도"(//)와 마지막 문자 (.$)를 대체하는 명령을 앞에 추가 할 수있다. 당신은 단지 예를 printf을 위해 사용할 수 있습니다

생각
text='PUTVAL downloads/exec-environmental/temperature-cpu interval=30 N:' 
printf "%s%3.1f\n" "$text" $(/usr/local/bin/pcsensor -l60 -n) 
+0

응답 해 주셔서 감사합니다. 그럼 그 때입니다. 여분의 숫자를 제거하면 다른 상황에서는 아무 것도 변경되지 않았습니다. 그냥 내가 생각할 수있는 모든 것을 시도하고 있습니다. :) –