sed 사용법 2: echo커맨드와 파이프 그리고 sed 커맨드에서 s/word1/word2/gI
이번에는 화면에 텍스트를 출력하는 커맨드를 먼저 알아보는 것으로 시작하겠습니다.
아래의 내용을 화면에 출력하려고 합니다. one과 two 사이에는 공백이 3개 있습니다.
one two
echo라는 커맨드를 써보겠습니다. echo 다음에 오는 텍스트나 숫자를 화면에 출력하는 커맨드입니다. 다음 커맨드를 터미널에서 쳐 보겠습니다.
echo one two
일부러 one과 two사이에 3개의 공뱍을 넣었습니다. 하지만 위의 커맨드는 one이라는 텍스트와 two라는 텍스트를 따로 인식해 두 텍스트 사이에 공백 하나만 넣고 출력합니다. 출력 결과는 다음과 같습니다.
one two
일부러 one과 two사이에 3개의 공뱍을 넣었습니다. 하지만 화면에는 one과 two를 출력하지만 커맨드에 있던 공백 세개중에 두개가 없어졌습니다. echo는 공백으로 나뉜 one과 two 두단어를 읽어들입니다. 그리고 화면에는 두 단어사이에 공백 하나만 사이에 넣고 출력하기 때문입니다. 이렇게 공백이 없어지는 것을 막으려면 공백 3개를 포함한 one과 two 를 하나의 텍스트 (또는 문자열)로 인식하게 해야 합니다. 그렇게 하려면 두 단어 양쪽 끝을 따옴표로 묶어야 합니다.
echo "one two"
그러면 echo는 따옴표 안에 있는 공백을 포함한 텍스트를 하나의 텍스트로 인식해 읽고 그 내용을 그대로 출력합니다.
one two
일반 텍스트를 묶어 줄때는 작은 따옴표를 쓰나 큰 따옴표를 쓰나 거의 차이가 없습니다. 작은 따음표를 쓸때와 큰 따옴표를 쓸때와의 차이는 나중에 구체적으로 설명하겠습니다.
지난번 자료에서 화면에 출력하는 내용을 파일에 저장하려면 > filename 을 커맨드 끝에 추가하면 된다는 것을 알 았습니다. 따라서 “one two” 텍스트를 test.txt 파일에 저장하려면 다음과 같은 커맨드를 입력해서 실행하면 됩니다.
echo "one two" > test.txt
test.txt파일에 저장된 내용을 확인하려면 아래의 커맨드를 실행하면 됩니다.
cat test.txt
echo 다음에 썼던 택스트가 파일에 잘 저장되어 있음을 확인할 수 있습니다.
화면에 출력하는 내용을 그대로 sed 커맨드에 키보드로 입력하는 것처럼 넘길 수도 있습니다. 이때는 | 라는 기호를 다음과 같이 씁니다.
echo "one two" | sed 's/one/1/'
그냥 sed ‘s/one/1/’ 커맨드를 입력해 실행하면 직접 “one two”의 따옴표안 텍스트를 키보드로 입력해야합니다. 하지만 위에서 처럼 두 커멘드 사이에 | 를 넣어 한줄에 입력하고 실행하면, 원래 첫번째 커맨드를 실행해 화면에 출력될 내용을 두번째 커맨드를 실행할때 컴퓨터가 대신 입력해줍니다. 이 과정을 터미널에서는 보여주지 않고요. 이렇게 커맨드 사이에 | 기호를 넣어서 앞 커맨드의 출력을 뒤 커맨드의 입력으로 넘겨주는 것을 ‘파이프'(pipe)라고 합니다.
| 기호 다음에 온 sed 는 one을 1로 바꾸는 sed 커맨드이므로, echo 코맨드로 넘겨 받은 “one two”에서 one을 1로 바꾼 결과를 출력합니다. 출력 결과는 다음과 같습니다.
1 two
이제 다음과 같은 커맨드를 시행해 보겠습니다.
echo "one two one three one four" | sed 's/one/1/'
여기에서도 원래 echo 커맨드가 화면에 출력할 따옴표안의 텍스트를 | 기호 다음에오는 커맨드의 입력으로 대신 넣어 줍니다. 결과를 보죠.
1 two one three one four
그런데, 첫번째 one만 1로 바꾸고 두번째와 세번째의 one은 그대로 입니다. 처음 나온 one만 1로 바꿨기 때문입니다. 같은 줄에서 그다음에 오는 one까지 바꿀려면 s/one/1/다음에 g를 붙여 다음과 같이 입력해 실행해야 합니다.
echo "one two one three one four" | sed 's/one/1/g'
그려면 출력되는 결과는 다음과 같습니다.
1 two 1 three 1 four
이번엔 대문자도 섞어서 써보겠습니다.
echo "one two One three oNe four" | sed 's/one/1/g'
그러면 결과는 다음과 같습니다.
1 two One three oNe four
정확하게 one 이라고 쓴것만 1로 바꾸고 나머지는 그대로 입니다. 소문자와 대문자를 다른 글자로 인식했기 때문에 One과 oNe은 1로 바꾸지 않았습니다.
대문자 소문자를 같은 글자로 인식하게 하려면 s/one/1/g 끝에 I(i의 대문자)를 붙여주면됩니다. I를 먼저쓰고 g를 다음에 써도 됩니다.
echo "one two One three oNe four" | sed 's/one/1/gI'
결과는 아래와 같이 소문자 대문자 구분없이 모든 one을 1로 바꿨습니다.
1 two 1 three 1 four