아직 Bash를 처음 접했기 때문에 지친 한 주였습니다. 나는 지금까지 그것을 좋아하고 긴 체인 튜브를 정말 좋아합니다. 하지만 내가 알아차린 것은 STDOUT을 변수로 사용해야 한다면 파이프를 끊어야 한다는 것입니다.
예는 다음과 같습니다.
echo -e 'Going to the movies can be fun.
When a dog found a cat a trouble began.
Do not text while driving please.' > example
두 번째 행의 모든 "A"를 "THE"로 바꾸고 싶다고 가정해 보겠습니다. 이것이 내가 현재 하는 일이다.
cat example | head -2 | tail -1 | sed 's/ a / the /g'
이게 내가 원하는 방식이야
# None of these work
cat example | head -2 | tail -1 | ${xargs//a /the }
cat example | head -2 | tail -1 | ${cat//a /the }
cat example | head -2 | tail -1 | ${$0//a /the }
cat example | head -2 | tail -1 | ${\1//a /the }
이제 변수를 만든 다음 bash 문자열 조작을 사용해야 합니다.
middle=$(cat example | head -2 | tail -1)
echo ${middle//a /the }
이 예에서는 많은 도구를 사용할 수 있다는 것을 알고 있습니다.
cat example | awk 'gsub(/ a/," the");'
제가 실제로 알아내려고 하는 것은 STDOUT을 변수로 파이프하는 방법이 있는지 여부입니다.
답변1
a를 두 번째 줄의 로 바꾸고 파이프라인을 계속하려면 어떻게 해야 합니까?
sed
모든 a
s,event를 시작 및 종료와 일치 하도록 먼저 수정합니다 .
sed -r -e 's/(^| )a($| )/\1the\2/g'
그런 다음 라인 2에서만 일치하도록 만드십시오.
sed -r -e '2 s/(^| )a($| )/\1the\2/g'
이제 당신은 할 수 있습니다
echo -e 'Going to the movies can be fun.
When a dog found a cat a trouble began.
Do not text while driving please.' | sed -r -e '2 s/(^| )a($| )/\1the\2/g' | less
또 다른 솔루션
먼저 삭제cat
cat
파일을 열고 출력으로 파이프하면 다음 명령으로 파이프됩니다. 입력 리디렉션( )을 사용하면 쉘이 파일을 열고 다음(지금은 첫 번째) 명령의 입력으로 보내도록 할 수 있습니다 <
. command args <input-file
or 로 쓸 수 있습니다 <input-file command args
. 명령에서 .txt 파일을 어디에 넣는지는 중요하지 않습니다 <input-file
. 파이프를 왼쪽에서 오른쪽으로 읽을 수 있도록 리디렉션을 먼저 넣었습니다.
< example head -2 | tail -1 | sed 's/ a / the /g'
대안(정확히 동일한 작업 수행):
head -2 <example | tail -1 | sed 's/ a / the /g'
아래와 동일하게 작동하지만 프로세스가 하나 더 적습니다.
cat example | head -2 | tail -1 | sed 's/ a / the /g'
다음은 캡슐화입니다. 여기서는 3개의 명령을 괄호로 묶은 다음 3개의 명령 모두의 출력을 다른 명령으로 파이프할 수 있습니다(여기서는 less를 사용합니다).
{
< example head -1
< example head -2 | tail -1 | sed 's/ a / the /g'
< example tail -1
} | less
답변2
명령 대체는 (사용하는 것과 마찬가지로) 방법이지만 IMHO $middle
이러한 경우에는 파이프하는 것이 더 쉽습니다.sed
즉, 당신이 단지 배우고 있다는 것을 알고 있지만 이를 결합하는 것은 거의 head
필요 하지 않습니다 . 귀하의 예는 순전히 다음 과 같이 표현될 수 있습니다 .tail
sed
sed
sed -n '2s/ a / the /gp' example
-n
기본적으로 출력 억제2
두 번째 줄 일치s/ a / the /g
("g"lobal) 의 모든 항목을 바꿉니다a
.p
결과 인쇄