Bash / sed хуваарилагч

sed хуваарилагч

sed нь "Stream EDitor" гэсэн үгийн товчлол юм. Текст боловсруулах хамгийн хүчирхэг хэрэгслүүдийн нэг бөгөөд файлыг нэг удаа уншиж, мөр бүрт өөрчлөлт хийдэг. Файл нээлгүйгээр агуулгыг солих, устгах, шинэчлэх боломжтой.

Үндсэн хэрэглээ — текст солих

sed-н хамгийн түгээмэл хэрэглээ бол s (substitute) команд:

bash
# "hello"-г "сайн уу" болгон солих
echo "hello world" | sed 's/hello/сайн уу/'

# Гаралт:
# сайн уу world

Бүтэц: s/хайх_текст/солих_текст/

bash
# Файл дотрох текстийг солих (дэлгэцэнд харуулна, файлыг өөрчлөхгүй)
sed 's/error/алдаа/' app.log

# Файлыг шууд өөрчлөх (-i тугтай)
sed -i 's/localhost/production-server/' config.txt

# macOS дээр -i-н дараа хоосон string шаардана
sed -i '' 's/localhost/production-server/' config.txt

g тугтай бүх тохиолдлыг солих

Анхдагч байдлаар sed зөвхөн мөр бүрийн эхний тохиолдлыг солино. Бүгдийг солихын тулд g (global) нэмнэ:

bash
echo "cat dog cat bird cat" | sed 's/cat/муур/'
# муур dog cat bird cat   ← зөвхөн эхнийх солигдсон

echo "cat dog cat bird cat" | sed 's/cat/муур/g'
# муур dog муур bird муур  ← бүгд солигдсон
bash
# Файл дотрох бүх tab-г хоосон зайгаар солих
sed 's/\t/ /g' code.txt

# Хоосон мөрүүдийг устгах
sed '/^$/d' text.txt

# Тайлбар мөрүүдийг (# гэж эхэлсэн) устгах
sed '/^#/d' script.sh

Мөрүүдтэй ажиллах

d команд нь мөр устгадаг:

bash
# Тодорхой мөрийг устгах
sed '5d' file.txt           # 5-р мөрийг устгана
sed '2,8d' file.txt         # 2-8-р мөрүүдийг устгана
sed '/pattern/d' file.txt   # pattern агуулсан мөрүүдийг устгана

# Мөрийн дугаараар харуулах
sed -n '5,10p' file.txt     # Зөвхөн 5-10-р мөрийг харуулна

-n тугтай бол sed өөрийн гаралт дарахгүй болно — зөвхөн p командтай мөрүүдийг харуулна. grep-н нэгэн адил мөрийг хайж харуулахад ашиглана.

Олон команд нэгэн зэрэг

-e тугтай олон sed команд дараалан ажиллуулна:

bash
# Хоёр солилтыг нэг дор хийх
sed -e 's/foo/bar/g' -e 's/baz/qux/g' file.txt

# Тайлбар мөр болон хоосон мөрийг нэгэн зэрэг устгах
sed -e '/^#/d' -e '/^$/d' config.sh

Практик жишээ

bash
#!/bin/bash

# Config файлын template-с бодит файл үүсгэх
cp config.template.txt config.prod.txt

# Placeholder утгуудыг бодит утгаар солих
sed -i 's/DB_HOST_PLACEHOLDER/db.example.com/g' config.prod.txt
sed -i 's/DB_PORT_PLACEHOLDER/5432/g' config.prod.txt
sed -i 's/APP_NAME_PLACEHOLDER/MyApp/g' config.prod.txt

echo "Config файл бэлэн боллоо!"
cat config.prod.txt
bash
# CSV файлын эхний баганы утгуудыг харах (таслалын өмнөх хэсэг)
sed 's/,.*//' data.csv

# HTML тагуудыг устгаж цэвэр текст авах
sed 's/<[^>]*>//g' page.html

# Файлын эхэнд мөр нэмэх
sed -i '1i\#!/bin/bash' script.sh

# Файлын төгсгөлд мөр нэмэх
sed -i '$a\# Файл дуусав' script.sh

sed эхэндээ хачин харагдаж болох ч дадлага хийх тусам хурдан ойлгомжтой болно. Хамгийн их хэрэглэгддэг s/хуучин/шинэ/g хэлбэрийг сайн сурвал хэдийн маш хэрэгтэй болсон байна.

Дараагийн хичээлд:

awk командыг судална — мөр ба баганаар текстийг боловсруулах, тооцоо хийх, тайлан гаргах хүчирхэг хэл.