파이프에 부착하고 통과하시겠습니까?

파이프에 부착하고 통과하시겠습니까?

두 개의 숫자를 나누는 간단한 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

대체 방법:

핵심요약: catstdin( -)을 인수로 연결하기 위한 것입니다. 연결된 스트림을 줄바꿈으로 구분합니다. 필요하지 않은 경우 제거하세요.

안타깝게도 이 접근 방식은 특정 사용 사례에서는 약간 번거롭습니다. 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

관련 정보