두 개의 숫자를 나누는 간단한 bash 함수가 있습니다.
echo "750/12.5" | bc
출력을 bc
가져와 /24
결과를 bc
.
그것은 다음과 같습니다:
echo "750/12.5" | bc | echo $1 + "/24" | bc
$1
파이프라인 결과는 어디에 있습니까?
추신: echo "750/12.5/24" | bc
질문에서 제가 할 수 있는 일은 파이프라인 결과에 텍스트를 추가하는 것입니다.
답변1
sed
이를 달성하기 위해 줄 끝을 사용 하고 교체했습니다.
echo "my text" | sed 's/$/ more text/'
반품:
my text more text
귀하의 예:
echo "750/12.5" | bc | sed 's/$/\/24/' | bc
답변2
대체 방법:
핵심요약: cat
stdin( -
)을 인수로 연결하기 위한 것입니다. 연결된 스트림을 줄바꿈으로 구분합니다. 필요하지 않은 경우 제거하세요.
안타깝게도 이 접근 방식은 특정 사용 사례에서는 약간 번거롭습니다. bc
중간에 줄바꿈이 있으면 표현식이 실패하기 때문입니다.
$ echo "750/12.5" | bc | cat - <(echo "/24") | bc
60
(standard_in) 2: parse error
원래 결과에서 개행 문자를 제거하여 이 문제를 해결할 수 있습니다 bc
.
$ echo "750/12.5" | bc | tr -d '\n' | cat - <(echo "/24") | bc
2
그러나 "bashappend to Pipe"를 검색하여 이 문제를 발견했으며 제 경우에는 실제로하다연결 사이에 개행이 필요합니다. 따라서 같은 이유를 가진 사람들을 위해 다음을 사용하십시오 | cat - <(...)
.
$ echo foo | cat - <(echo bar)
foo
bar
$ echo foo | cat - <(echo bar) | sort | cat - <(echo last_line)
bar
foo
last_line
$ echo foo | cat - <(echo bar) | sort | cat <(echo header) - <(echo last_line)
header
bar
foo
last_line
답변3
가장 간단한 옵션에서는 파이프 스트림에 추가됩니다.
$ echo "750/12.5" | { bc; echo "/24"; }
60
/24
그러나 tr을 사용해야 하는 것을 피하기 위해 예상치 못한 개행 문자가 있습니다.
$ echo "750/12.5" | { bc | tr -d '\n' ; echo "/24"; }
60/24
또는 명령 확장으로 인해 후행 줄 바꿈이 제거된다는 점을 고려하세요.
$ printf '%s' $( echo "750/12.5" | bc ); echo "/24"
60/24
하지만 아마도 올바른 접근 방식은 다음과 같아야 합니다.
$ echo "$(echo "750/12.5" | bc )/24"
60/24
bc에서 사용하려면 다음과 같이 작성할 수 있습니다.
$ bc <<<"$(bc <<<"750/12.5")/24"
2
합리적인 부동 소수점 정밀도를 얻으려면 다음과 같아야 합니다.
$ bc <<<"scale=10;$(bc <<<"scale=5;750/12.5")/24"
2.5000000000
bc 인스턴스가 두 개 있으므로 두 개의 스케일이 필요합니다.
물론 bc 인스턴스에는 하나의 스케일만 필요합니다.
$ bc <<<"scale=5;750/12.5/24"
사실, 여러분이 생각해야 할 것은 문자열입니다:
$ a=$(echo "750/12.5") # capture first string.
$ echo "$a/24" | bc # extend the string
2
규모에 대한 위의 설명은 여기서도 여전히 유효합니다.
답변4
awk
다음을 사용하여 파이프에 무엇이든 삽입/추가 할 수 있습니다 .
$ date | awk 'BEGIN{print "prefix line"} {print} END{print "suffix line"}'
prefix line
Mo 21. Aug 15:24:30 CEST 2023
suffix line
어디
date
- 입력 파이프입니다(예: 현재 날짜).BEGIN{print "prefix line"}
- 이 블록은 메인 앞에 출력을 삽입합니다.{print}
- 입력 파이프의 내용을 인쇄합니다. 필요한 경우 여기에서 일부 처리를 수행할 수 있습니다.END{print "suffix line"}
- 메인 뒤에 출력을 추가합니다.
한 줄로 동일한 작업을 수행하려면 다음을 사용하세요 printf
.
$ date | awk 'BEGIN{printf("prefix line >> ")} {printf($0)} END{printf(" << suffix line")}'
prefix line >> Mo 21. Aug 15:32:08 CEST 2023 << suffix line/upload/sc505enb/tmp>
$ echo "750/12.5" | bc | awk '{printf($0)} END{printf("/24\n")}'
60/24