파이프에 추가하고 전달하시겠습니까?

파이프에 추가하고 전달하시겠습니까?

두 숫자를 나누는 간단한 bash 함수가 있습니다.

echo "750/12.5" | bc

의 출력을 가져와 해당 결과를 의 다른 인스턴스에 bc추가 하고 파이프 하고 싶습니다 ./24bc

다음과 같은 것 :

echo "750/12.5" | bc | echo $1 + "/24" | bc

$1파이프된 결과는 어디에 있습니까?

echo "750/12.5/24" | bcPS 나는 파이프 결과에 텍스트를 추가하는 것과 관련하여 더 많은 질문을 할 수 있다는 것을 알고 있습니다 .

답변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

관련 정보