Linux 스트림 편집

LinuxBeginner
지금 연습하기

소개

Linux 스트림 편집 랩에 오신 것을 환영합니다. 이 랩에서는 텍스트 구문 분석 및 변환을 위한 강력한 명령줄 유틸리티인 sed (Stream Editor) 사용법을 배우게 됩니다. sed는 입력 스트림 (파일 또는 파이프라인의 입력) 에 대한 기본적인 텍스트 변환을 수행하는 데 사용됩니다.

이 랩을 마치면 다음을 수행할 수 있습니다.

  • sed를 사용하여 기본적인 텍스트 치환 수행
  • sed를 사용하여 파일 직접 편집 (in-place editing)
  • 전체 파일에 걸쳐 전역 치환 적용
  • 고급 텍스트 처리 기술 사용

배우게 될 기술은 Linux 에서 다양한 시스템 관리 및 텍스트 처리 작업에 필수적인 파일 및 텍스트 스트림을 효율적으로 조작하는 데 도움이 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 96%입니다.학습자들로부터 97%의 긍정적인 리뷰율을 받았습니다.

sed 기본 사용법 및 텍스트 치환

이 단계에서는 sed의 기본 사항과 간단한 텍스트 치환을 수행하는 방법을 배우겠습니다. sed 명령은 편집기에서 파일을 열지 않고도 파일에서 텍스트를 검색, 찾기 및 바꾸기, 삽입 및 삭제할 수 있는 강력한 텍스트 처리 도구입니다.

먼저, 다음을 실행하여 시스템에 sed가 설치되어 있는지 확인해 보겠습니다.

which sed

다음과 유사한 출력이 표시되어야 합니다.

/usr/bin/sed

이는 sed가 사용 가능하다는 것을 확인합니다. 어떤 이유로 설치되지 않은 경우, 다음 명령으로 설치할 수 있습니다.

sudo apt-get update
sudo apt-get install -y sed

이제 작업할 텍스트 파일을 만들어 보겠습니다. 현재 디렉토리에 sample.txt라는 파일을 생성합니다.

echo "Linux is a powerful operating system." > ~/project/sample.txt
echo "Many users prefer Linux for servers." >> ~/project/sample.txt
echo "Linux has strong security features." >> ~/project/sample.txt

새 파일의 내용을 살펴보겠습니다.

cat ~/project/sample.txt

다음과 같은 내용이 표시되어야 합니다.

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.

이제 sed를 사용하여 기본적인 치환을 수행해 보겠습니다. 다음 명령은 각 줄에서 "Linux"의 첫 번째 발생을 "Ubuntu"로 바꿉니다.

sed 's/Linux/Ubuntu/' ~/project/sample.txt

다음과 같은 내용이 표시되어야 합니다.

Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.

sed가 수정된 텍스트를 표준 출력 (터미널) 에 인쇄했지만, 원본 파일은 변경되지 않았습니다. 다음을 실행하여 확인할 수 있습니다.

cat ~/project/sample.txt

출력은 여전히 "Linux"를 표시해야 하며 "Ubuntu"는 표시되지 않아야 합니다.

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.

sed 치환의 기본 구문은 다음과 같습니다.

sed 's/pattern/replacement/' filename

여기서:

  • s는 치환 명령입니다.
  • pattern은 바꾸려는 텍스트입니다.
  • replacement는 새 텍스트입니다.
  • filename은 입력 파일입니다.

다른 예를 시도해 보겠습니다. 이번에는 "powerful"을 "versatile"로 바꿉니다.

sed 's/powerful/versatile/' ~/project/sample.txt

다음과 같이 출력되어야 합니다.

Linux is a versatile operating system.
Many users prefer Linux for servers.
Linux has strong security features.

In-place 편집 및 전역 치환

이전 단계에서는 기본적인 텍스트 치환을 위해 sed를 사용하는 방법을 배웠지만, 변경 사항은 화면에만 표시되었고 파일에는 저장되지 않았습니다. 이 단계에서는 다음을 배우게 됩니다.

  1. -i 옵션을 사용하여 파일 직접 편집 (in-place editing)
  2. g 플래그를 사용하여 전역 치환 수행

In-place 편집

sed를 사용하여 파일에 영구적인 변경을 하려면 -i 옵션을 사용합니다. 이 옵션은 터미널에 출력을 인쇄하는 대신 파일을 직접 수정합니다.

"Linux"를 "Ubuntu"로 바꿔서 sample.txt 파일을 수정해 보겠습니다.

sed -i 's/Linux/Ubuntu/' ~/project/sample.txt

이 명령은 이전 단계와 달리 가시적인 출력을 생성하지 않습니다. 파일의 내용이 변경되었는지 확인해 보겠습니다.

cat ~/project/sample.txt

이제 다음을 볼 수 있습니다.

Ubuntu is a powerful operating system.
Many users prefer Ubuntu for servers.
Ubuntu has strong security features.

변경 사항이 파일에 저장되었습니다! 이것이 sed를 사용한 in-place 편집의 강력함입니다.

전역 치환

기본적으로 sed는 각 줄에서 패턴의 첫 번째 발생만 바꿉니다. 모든 발생을 바꾸려면 치환 명령의 끝에 g (global, 전역) 플래그를 사용합니다.

반복되는 텍스트가 있는 새 파일을 만들어 보겠습니다.

echo "The red car stopped at the red light near the red building." > ~/project/colors.txt

이제 전역 플래그 없이 sed를 사용하여 "red"를 "blue"로 바꿔보겠습니다.

sed 's/red/blue/' ~/project/colors.txt

다음과 같은 내용이 표시되어야 합니다.

The blue car stopped at the red light near the red building.

"red"의 첫 번째 발생만 "blue"로 바뀐 것을 확인하세요. 이제 전역 플래그를 사용해 보겠습니다.

sed 's/red/blue/g' ~/project/colors.txt

출력은 다음과 같아야 합니다.

The blue car stopped at the blue light near the blue building.

"red"의 모든 발생이 "blue"로 바뀌었습니다!

sample.txt 파일에 이것을 적용해 보겠습니다. 먼저 "Ubuntu"의 발생을 더 추가해 보겠습니다.

echo "Ubuntu is great. I use Ubuntu daily for my work with Ubuntu tools." >> ~/project/sample.txt

이제 전역 플래그와 in-place 편집을 사용하여 "Ubuntu"의 모든 발생을 "Linux"로 바꿔보겠습니다.

sed -i 's/Ubuntu/Linux/g' ~/project/sample.txt

변경 사항을 확인해 보겠습니다.

cat ~/project/sample.txt

다음과 같은 내용이 표시되어야 합니다.

Linux is a powerful operating system.
Many users prefer Linux for servers.
Linux has strong security features.
Linux is great. I use Linux daily for my work with Linux tools.

파일 전체에서 "Ubuntu"의 모든 발생이 "Linux"로 바뀌었습니다.

In-place 편집 전에 백업 생성

in-place 편집을 사용할 때는 원본 파일의 백업을 생성하는 것이 좋습니다. -i 옵션에 확장자를 제공하여 이 작업을 수행할 수 있습니다.

sed -i.bak 's/Linux/Ubuntu/g' ~/project/sample.txt

이 명령은 다음을 수행합니다.

  1. sample.txt의 백업을 sample.txt.bak로 생성합니다.
  2. sample.txt에서 "Linux"의 모든 발생을 "Ubuntu"로 바꿉니다.

두 파일을 모두 확인해 보겠습니다.

cat ~/project/sample.txt
cat ~/project/sample.txt.bak

첫 번째 명령은 모든 "Linux"가 "Ubuntu"로 바뀐 것을 표시해야 하며, 백업 파일에는 여전히 "Linux"가 포함되어 있어야 합니다.

sed 고급 명령어 및 패턴 매칭

이제 sed를 사용한 기본적인 치환 및 in-place 편집을 마스터했으므로, 몇 가지 더 고급 기능을 살펴보겠습니다.

  1. 다른 구분 기호 사용
  2. 특정 줄을 대상으로 주소 범위 사용
  3. 여러 명령 결합

다른 구분 기호 사용

치환 명령에서 슬래시 /를 구분 기호로 사용해 왔지만, sed는 모든 문자를 구분 기호로 사용할 수 있습니다. 이는 패턴 또는 대체 텍스트에 슬래시가 포함된 경우 특히 유용합니다.

파일 경로가 있는 파일을 만들어 보겠습니다.

echo "/usr/local/bin is in the PATH" > ~/project/paths.txt
echo "My config is in /etc/myapp/config.json" >> ~/project/paths.txt

/usr/local/bin/opt/bin으로 바꾸려면 슬래시를 사용하는 것이 혼란스러울 수 있습니다.

sed 's/\/usr\/local\/bin/\/opt\/bin/' ~/project/paths.txt

대신, #과 같은 다른 구분 기호를 사용할 수 있습니다.

sed 's#/usr/local/bin#/opt/bin#' ~/project/paths.txt

이것이 훨씬 더 읽기 쉽습니다! 출력은 다음과 같아야 합니다.

/opt/bin is in the PATH
My config is in /etc/myapp/config.json

다른 일반적인 구분 기호로는 |, :, 및 _가 있습니다.

주소 지정 - 특정 줄 대상 지정

sed를 사용하면 치환을 적용할 줄을 지정할 수 있습니다. 이는 명령 앞에 주소를 붙여서 수행됩니다.

번호가 매겨진 줄이 있는 새 파일을 만들어 보겠습니다.

echo "Line 1: This is the first line." > ~/project/numbered.txt
echo "Line 2: This is the second line." >> ~/project/numbered.txt
echo "Line 3: This is the third line." >> ~/project/numbered.txt
echo "Line 4: This is the fourth line." >> ~/project/numbered.txt
echo "Line 5: This is the fifth line." >> ~/project/numbered.txt

3 번째 줄에서만 "line"을 "row"로 바꾸려면:

sed '3 s/line/row/' ~/project/numbered.txt

출력은 다음과 같아야 합니다.

Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth line.
Line 5: This is the fifth line.

줄 범위를 지정할 수도 있습니다. 2 번째 줄부터 4 번째 줄까지 "line"을 "row"로 바꾸려면:

sed '2,4 s/line/row/' ~/project/numbered.txt

출력은 다음과 같아야 합니다.

Line 1: This is the first line.
Line 2: This is the second row.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.

또 다른 유용한 기능은 패턴을 기반으로 줄을 일치시키는 기능입니다. 예를 들어, "third" 또는 "fourth"를 포함하는 줄에서만 "line"을 "row"로 바꾸려면:

sed '/\(third\|fourth\)/ s/line/row/' ~/project/numbered.txt

출력은 다음과 같아야 합니다.

Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.

여러 명령 결합

-e 옵션을 사용하거나 세미콜론으로 명령을 구분하여 여러 sed 명령을 결합할 수 있습니다.

"first"를 "1st"로, "second"를 "2nd"로, "third"를 "3rd"로 단일 명령으로 바꿔보겠습니다.

sed -e 's/first/1st/' -e 's/second/2nd/' -e 's/third/3rd/' ~/project/numbered.txt

또는 세미콜론을 사용할 수 있습니다.

sed 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt

두 명령 모두 동일한 출력을 생성해야 합니다.

Line 1: This is the 1st line.
Line 2: This is the 2nd line.
Line 3: This is the 3rd line.
Line 4: This is the fourth line.
Line 5: This is the fifth line.

이제 이러한 변경 사항을 영구적으로 적용해 보겠습니다.

sed -i 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt

그리고 변경 사항을 확인합니다.

cat ~/project/numbered.txt

서수를 사용하여 업데이트된 텍스트를 볼 수 있습니다.

sed 스크립트 활용

이전 단계에서는 명령줄에서 직접 sed 명령을 실행했습니다. 그러나 더 복잡한 작업의 경우 sed 스크립트 파일을 만드는 것이 더 편리한 경우가 많습니다. 이를 통해 다음을 수행할 수 있습니다.

  1. 여러 sed 명령을 구성합니다.
  2. 각 명령이 수행하는 작업을 설명하는 주석을 추가합니다.
  3. 서로 다른 파일에서 동일한 작업을 재사용합니다.

sed 스크립트 생성

몇 가지 텍스트 변환을 수행하는 간단한 sed 스크립트를 만들어 보겠습니다.

cat > ~/project/transform.sed << 'EOF'
## Replace "Linux" with "Ubuntu"
s/Linux/Ubuntu/g

## Replace "user" with "developer"
s/user/developer/g

## Replace "system" with "platform"
s/system/platform/g

## Convert "is" to uppercase
s/is/IS/g
EOF

이 스크립트는 네 가지 치환을 수행합니다.

  1. "Linux"의 모든 발생을 "Ubuntu"로 바꿉니다.
  2. "user"의 모든 발생을 "developer"로 바꿉니다.
  3. "system"의 모든 발생을 "platform"으로 바꿉니다.
  4. "is"의 모든 발생을 대문자 "IS"로 변환합니다.

스크립트를 테스트할 새 파일을 만들어 보겠습니다.

cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF

sed 스크립트 실행

테스트 파일에서 sed 스크립트를 실행하려면 -f 옵션을 사용합니다.

sed -f ~/project/transform.sed ~/project/test.txt

다음과 같은 내용이 표시되어야 합니다.

Ubuntu IS a powerful operating platform.
The developer interface IS very customizable.
Many Ubuntu developers prefer the command-line interface.
The platform resources are efficiently managed.

스크립트의 모든 치환이 적용되었습니다!

스크립트를 사용한 In-place 편집

명령줄 sed 명령과 마찬가지로, 스크립트를 사용하여 -i 옵션으로 in-place 편집을 수행할 수 있습니다.

sed -i -f ~/project/transform.sed ~/project/test.txt

변경 사항을 확인해 보겠습니다.

cat ~/project/test.txt

이제 파일에 변환된 텍스트가 포함되어야 합니다.

스크립트를 사용한 백업 생성

그리고 다시, 변경하기 전에 백업을 만들 수 있습니다.

## First, let's restore the original content
cat > ~/project/test.txt << 'EOF'
Linux is a powerful operating system.
The user interface is very customizable.
Many Linux users prefer the command-line interface.
The system resources are efficiently managed.
EOF

## Now run sed with a backup
sed -i.bak -f ~/project/transform.sed ~/project/test.txt

수정된 파일과 백업을 모두 확인해 보겠습니다.

cat ~/project/test.txt
cat ~/project/test.txt.bak

첫 번째 명령은 변환된 텍스트를 표시해야 하며, 백업 파일에는 원본 텍스트가 포함되어야 합니다.

여러 파일에 sed 스크립트 적용

sed 스크립트를 사용하는 것의 장점 중 하나는 동일한 변환을 여러 파일에 쉽게 적용할 수 있다는 것입니다.

몇 개의 테스트 파일을 더 만들어 보겠습니다.

## Create test1.txt
cat > ~/project/test1.txt << 'EOF'
Linux offers excellent system performance.
Many users appreciate its stability.
EOF

## Create test2.txt
cat > ~/project/test2.txt << 'EOF'
The Linux community provides great support.
New users can find helpful resources online.
EOF

## Create test3.txt
cat > ~/project/test3.txt << 'EOF'
The system updates are well-managed in Linux.
Users can customize their experience.
EOF

이제 sed 스크립트를 이러한 모든 파일에 한 번에 적용해 보겠습니다.

sed -i -f ~/project/transform.sed ~/project/test1.txt ~/project/test2.txt ~/project/test3.txt

변경 사항을 확인해 보겠습니다.

cat ~/project/test1.txt
cat ~/project/test2.txt
cat ~/project/test3.txt

세 파일 모두 스크립트에 따라 변환된 텍스트를 표시해야 합니다.

이는 동일한 일련의 변환을 사용하여 여러 파일을 일괄 처리하기 위한 sed 스크립트의 강력함을 보여줍니다.

요약

이 랩에서는 Linux 에서 텍스트 파일을 조작하기 위해 Stream Editor 인 sed를 사용하는 방법을 배웠습니다. sed의 몇 가지 중요한 측면에 대한 실질적인 경험을 얻었습니다.

  • s 명령을 사용한 기본적인 텍스트 치환
  • -i 옵션을 사용한 in-place 편집
  • g 플래그를 사용한 전역 치환
  • -i.bak 옵션을 사용하여 편집 전에 백업 생성
  • 치환 패턴에 서로 다른 구분 기호 사용
  • 주소 및 범위를 사용하여 특정 줄 대상 지정
  • 더 복잡한 작업을 위해 sed 스크립트 생성 및 실행
  • 한 번에 여러 파일에 변환 적용

이러한 기술은 Linux 환경에서 효율적인 텍스트 처리에 필수적입니다. 편집기에서 열지 않고 텍스트 파일을 조작하는 기능은 대량의 텍스트 데이터를 처리하거나 여러 파일에서 체계적인 변경을 해야 하는 시스템 관리자, 개발자 및 데이터 분석가에게 특히 유용합니다.

Linux 작업을 계속하면서 sedgrep, awk, cut과 같은 다른 유틸리티와 함께 텍스트 처리 도구 상자에서 없어서는 안 될 도구임을 알게 될 것입니다.