a를 두 번째 줄의 로 바꾸고 파이프라인을 계속하려면 어떻게 해야 합니까?

a를 두 번째 줄의 로 바꾸고 파이프라인을 계속하려면 어떻게 해야 합니까?

아직 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모든 as,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-fileor 로 쓸 수 있습니다 <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필요 하지 않습니다 . 귀하의 예는 순전히 다음 과 같이 표현될 수 있습니다 .tailsedsed

sed -n '2s/ a / the /gp' example
  • -n기본적으로 출력 억제
  • 2두 번째 줄 일치
  • s/ a / the /g("g"lobal) 의 모든 항목을 바꿉니다 a.
  • p결과 인쇄

관련 정보