stdin과 문자열을 연결하는 방법은 무엇입니까?


108

stdin을 문자열에 연결하는 방법은 무엇입니까?

echo "input" | COMMAND "string"

그리고 얻다

inputstring

답변:


119

A는 해키 비트, 그러나 이것은 당신이 질문 (수용 파이프를 사용에 무엇을 요구 할 수있는 가장 짧은 방법이 될 수도 stdout에서 echo "input"와 같은 stdin다른 프로세스 / 명령 :

echo "input" | awk '{print $1"string"}'

산출:

inputstring

정확히 어떤 작업을 수행하려고합니까? 더 많은 컨텍스트는 더 나은 솔루션에 대한 더 많은 방향을 얻을 수 있습니다.

업데이트-댓글에 응답 :

뿡 빵뀨

당신이 원하는 것을하는 더 관용적 인 방법은 다음과 같습니다 :

echo 'http://dx.doi.org/'"$(pbpaste)"

$(...)구문라고 명령 대체 . 간단히 말해, 새 서브 쉘에 포함 된 명령을 실행하고 stdout출력을 $(...)상위 쉘에서 호출 된 위치로 대체합니다 . 따라서 실제로 다음을 얻을 수 있습니다.

echo 'http://dx.doi.org/'"rsif.2012.0125"

1
감사! 이것은 훌륭하게 작동합니다. 내가 수행하려는 정확한 작업은 클립 보드 (DOI)에서 문자열을 가져와 URL 앞에 추가하는 것입니다. pbpaste | awk '{print "http://dx.doi.org/"$1}'http://dx.doi.org/10.1098/rsif.2012.0125
따라서이

5
@ sampson-chen, 나는 '{print $0"string"}'모든 것을 잡는 데 사용 합니다.
Roman Newaza 2013 년

3
실제로 string모든 줄에 추가 됩니다. 시도해보십시오 echo 'input'\n'another line' | awk '{print $0"string"}'.
tomekwi

55

cat -stdin에서 읽는 데 사용 $()하고 후행 개행을 버리기 위해 넣으십시오.

echo input | COMMAND "$(cat -)string"

그러나 파이프를 버리고 명령 대체에서 왼쪽의 출력을 가져 오지 않는 이유는 무엇입니까?

COMMAND "$(echo input)string"

1
다음은 실용적인 예입니다. find ~ / other_program / lib -name "* .jar"| tr '\ n' ':'| 에코 "$ (고양이 -) ~ / java_app / 클래스"
애쉬 윈 Jayaprakash

2
이것은 bash에서 나를 위해 작동하지만 zsh에서는 "cat :-: Input / output error"가 발생합니다. 원인이 무엇인지 아십니까?
jaymmer - 분석 재개 모니카

"COMMAND"는 솔루션을 나타내고 "echo input"은 좀 더 복잡한 프로세스를 나타냅니다. cat에 대한 "-"인수는 다른 파일 인수가있는 경우에만 필요하며 그렇지 않으면 기본값입니다. 그래서 의미하는 바는 : 에코 입력 | echo $ (cat) string
Denis Howe

46

나는 종종 파이프를 사용하기 때문에 이것은 stdin의 접두사와 접미사를 쉽게 접할 수있는 방법입니다.

echo -n "my standard in" | cat <(echo -n "prefix... ") - <(echo " ...suffix")
prefix... my standard in ...suffix

2
감사! 즉 실제로는 매우 사용하는 예를 시원 pipe하고cat
알렉스 Ivasyuv에게

1
이것은 최선의 해답이 될한다
크리스 Koston

1
왜 안돼 : echo "my standard in" | echo -e "prefix\n$(cat -)\nsuffix"? 또는 더 읽기 쉬운 버전 :echo "my standard in" | printf "%s\n%s\n%s\n" "prefix" "$(cat -)" "suffix"
MiniMax

1
@MiniMax 대답은 스트림에서 잘 작동하기 때문에 큰 표준 입력에서도 작동합니다.
anishpatel

1
@anishpatel 내 버전은 큰 표준 입력에서도 작동합니다. 차이 없음.
MiniMax


9

이를 수행하는 몇 가지 방법이 있습니다. 개인적으로 가장 좋은 방법은 다음과 같습니다.

echo input | while read line; do echo $line string; done

또 다른 방법은 sed 명령에서 "$"(줄 끝 문자)를 "문자열"로 대체하는 것입니다.

echo input | sed "s/$/ string/g"

내가 전자를 선호하는 이유는 무엇입니까? 예를 들어 다음 명령을 사용하여 문자열을 stdin에 즉시 연결하기 때문입니다.

(echo input_one ;sleep 5; echo input_two ) | while read line; do echo $line string; done

즉시 첫 번째 출력을 얻습니다.

input_one string

5 초 후에 다른 에코가 나타납니다.

input_two string

반면에 "sed"를 사용하면 먼저 괄호의 모든 내용을 수행 한 다음 "sed"에 제공하므로 명령은

(echo input_one ;sleep 5; echo input_two ) | sed "s/$/ string/g"

두 줄을 모두 출력합니다.

input_one string
input_two string

5 초 후.

이는 완료하는 데 오랜 시간이 걸리는 함수 호출을 수행하고 함수 출력에 대해 지속적으로 업데이트하려는 경우에 매우 유용 할 수 있습니다.


실제로 sed 옵션은 모든 입력 라인을 즉시 처리합니다.
tomekwi

한 줄의 입력에 대해 가장 간단한 해결책은 에코 입력 | (read v; echo $ {v} string) 순수 쉘이므로 sed와 같은 추가 프로세스가 필요하지 않습니다.
Denis Howe

7

이것이 몇 년 늦었다는 것을 알고 있지만 xargs -J 옵션을 사용하면이 작업을 수행 할 수 있습니다.

echo "input" | xargs -J "%" echo "%" "string"

이 때문에 그리고 있다 xargs를을 한 번에 파일의 여러 줄에이 작업을 수행 할 수 있습니다. 파일 'names'에 다음과 같이 세 줄이있는 경우 :

Adam
Bob
Charlie

다음과 같이 할 수 있습니다.

cat names | xargs -n 1 -J "%" echo "I like" "%" "because he is nice"

1
-J표준 / 일반적인 것 같지 않은 것 외에는 멋져 보입니다 . Linux (의 xargs일부 GNU findutils)에서 오류가 발생합니다. xargs: invalid option -- 'J'어떤 시스템이 켜져 있습니까?
arielf

3
-JMac 버전 용입니다. Linux의 -I경우 동일한 기능을 수행합니다.
user2635263 jul.

1
감사! 굉장히 유용하다. Linux에서이 단순화 된 버전도 잘 작동합니다. cat names | xargs -I% echo "I like % because he is nice"IOW : -n 1(를 암시하기 때문에 입력 한 줄당 한 번 xargs호출 할 필요가 없습니다. ) 또한 모든 개별 인수 인용이 중복되는 것 같습니다. echo-I-L1
arielf

3

게시 한 명령은 "input"문자열을 COMMAND의 stdin 스트림으로 사용하므로 COMMAND가 먼저 stdin의 내용을 인쇄 한 다음 명령 줄 인수를 인쇄하지 않는 한 찾고있는 결과를 생성하지 않습니다.

당신이 원하는 것은 명령 대체에 더 가까운 것 같습니다.

http://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution

명령 대체를 사용하면 다음과 같은 명령 줄을 사용할 수 있습니다.

echo input `COMMAND "string"`

이것은 먼저 "문자열"을 입력으로 사용하여 COMMAND를 평가 한 다음 해당 명령 실행 결과를 한 줄로 확장하여 '`'문자 사이에있는 내용을 대체합니다.


물론 @NaomRoss, Bourne 셸을 사용하거나 다른 "이동성"명령이 필요하지 않은 경우 백틱이 아닌와 같은 현대적인 명령 대체를 사용합니다 echo input $(COMMAND "string"). 모두에게 행운을 빕니다.
쉘터

1

고양이는 내 선택이 될 것입니다. ls | cat - <(echo new line)


SED는 .. 상류 파이프가 아무것도 출력이있는 경우 일을하지 않는 라인 기반의 명령입니다
clarkttfu

0

또한 작동합니다 :

seq -w 0 100 | xargs -I {} echo "string "{}

다음과 같은 문자열을 생성합니다.

string 000
string 001
string 002
string 003
string 004

...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.