Android

Paano gamitin ang sed upang mahanap at palitan ang string sa mga file

VLC Stream ?Subtitles? of ANY File/Language To Any Smart TV| Roku| Chromecast| Apple TV| Fire TV

VLC Stream ?Subtitles? of ANY File/Language To Any Smart TV| Roku| Chromecast| Apple TV| Fire TV

Talaan ng mga Nilalaman:

Anonim

Madalas kapag nagtatrabaho sa mga file ng teksto kakailanganin mong hanapin at palitan ang mga string ng teksto sa isa o higit pang mga file.

sed ay isang s tream ed itor. Maaari itong magsagawa ng pangunahing pagmamanipula ng teksto sa mga file at mga stream ng pag-input tulad ng mga pipelines. Sa sed maaari kang maghanap, hanapin at palitan, ipasok, at tanggalin ang mga salita at linya. Sinusuportahan nito ang pangunahing at pinalawak na mga regular na expression na nagbibigay-daan sa iyo upang tumugma sa mga kumplikadong pattern.

, pag-uusapan natin kung paano mahanap at palitan ang mga string ng sed . Ipapakita rin namin sa iyo kung paano magsagawa ng isang recursive na paghahanap at palitan.

Hanapin at Palitan ang String na may sed

Mayroong maraming mga bersyon ng sed , na may ilang mga pagkakaiba sa pagganap sa pagitan nila. Ang macOS ay gumagamit ng bersyon ng BSD at karamihan sa mga pamamahagi ng Linux ay kasama ng GNU sed pre-install nang default. Gagamitin namin ang bersyon ng GNU.

Ang pangkalahatang anyo ng paghahanap at pagpapalit ng teksto gamit ang sed kumukuha ng sumusunod na form:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Sa pamamagitan ng default na sed magsusulat ng output nito sa karaniwang output. Ang pagpipiliang ito ay nagsasabi sa sed upang i-edit ang mga file sa lugar. Kung ang isang extension ay ibinibigay (ex -i.bak) isang backup ng orihinal na file ay malilikha. s - Ang kapalit na utos, marahil ang pinaka ginagamit na utos sa sed. / / / - character na Delimiter. Maaari itong maging anumang character ngunit karaniwang ang slash ( / ) na character ay ginagamit. SEARCH_REGEX - Normal na string o isang regular na expression upang maghanap. REPLACEMENT - Ang tali ng kapalit. g - watawat ng pandaigdigang kapalit. Bilang default, binabasa ni sed ang file line ayon sa linya at binabago lamang ang unang pangyayari ng SEARCH_REGEX sa isang linya. Kapag ibinigay ang kapalit na watawat, ang lahat ng mga pangyayari ay papalitan. INPUTFILE - Ang pangalan ng file na nais mong patakbuhin ang utos.

Ito ay isang mahusay na kasanayan upang ilagay ang mga quote sa paligid ng argumento upang ang mga shell meta-character ay hindi mapalawak.

Tingnan natin ang mga halimbawa kung paano gamitin ang sed utos upang maghanap at palitan ang teksto sa mga file sa ilan sa mga karaniwang ginagamit na pagpipilian at watawat.

Para sa mga layunin ng pagpapakita, gagamitin namin ang sumusunod na file:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Gamit ang pandaigdigang kapalit na flag sed pumapalit sa lahat ng mga naganap na pattern ng paghahanap:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Tulad ng iyong napansin, sa nakaraang halimbawa ang substring foo loob ng foobar string ay pinalitan din. Kung hindi ito ang nais na pag-uugali, gamitin ang expression ng salitang may hangganan ( \b ) sa parehong mga dulo ng string ng paghahanap. Tinitiyak nito ang mga bahagyang salita ay hindi naitugma.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Upang gawing hindi insentibo ang pattern ng case match, gamitin ang watawat I . Sa halimbawa sa ibaba ginagamit namin pareho ang g at mga watawat:

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

Ang mas madali at mas madaling mabasa na opsyon ay ang paggamit ng isa pang delimiter character. Karamihan sa mga tao ay gumagamit ng vertical bar ( | ) o colon (:) ngunit maaari mong gamitin ang anumang iba pang karakter:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

Maaari ka ring gumamit ng mga regular na expression. Halimbawa upang maghanap sa lahat ng 3 mga numero ng numero at palitan ang mga ito sa number string na gagamitin mo:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Ang isa pang kapaki-pakinabang na tampok ng sed ay maaari mong gamitin ang ampersand character & na tumutugma sa naitugma na pattern. Ang karakter ay maaaring magamit nang maraming beses.

Halimbawa, kung nais mong magdagdag ng mga kulot na braces {} paligid ng bawat 3 numero na numero, uri:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Huling ngunit hindi bababa sa, palaging isang magandang ideya na gumawa ng isang backup kapag nag-edit ng isang file na may sed . Upang gawin iyon ay magbibigay lamang ng isang extension sa pagpipilian -i . Halimbawa, upang i-edit ang file.txt at i-save ang orihinal na file bilang file.txt.bak gagamitin mo:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Paghahanap at Palitan ang Recursive

Minsan nais mong muling maghanap ng mga direktoryo para sa mga file na naglalaman ng isang string at palitan ang string sa lahat ng mga file. Magagawa ito sa pamamagitan ng paggamit ng mga utos tulad ng find o grep upang maingat na makahanap ng mga file sa direktoryo at piping ang mga pangalan ng file upang mag sed .

Ang sumusunod na utos ay maingat na maghanap para sa mga file sa kasalukuyang direktoryo ng nagtatrabaho at ipasa ang mga pangalan ng file upang mag- sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Upang maiwasan ang mga isyu sa mga file na naglalaman ng puwang sa kanilang mga pangalan ay gumagamit ng opsyon na -print0 na nagsasabing find mag-print ng pangalan ng file, na sinusundan ng isang null character at pipipa ang output upang mag sed gamit ang xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Upang ibukod ang isang direktoryo gamitin ang pagpipilian na- -not -path . Halimbawa, kung pinalitan mo ang isang string sa iyong lokal na git repo upang ibukod ang lahat ng mga file na nagsisimula sa tuldok ( . ), Gamitin:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Ang isa pang pagpipilian ay ang paggamit ng grep utos upang maingat na hanapin ang lahat ng mga file na naglalaman ng pattern ng paghahanap at pagkatapos ay i-pipe ang mga filenames upang mag sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

Konklusyon

Bagaman mukhang kumplikado at kumplikado ito, sa una, ang paghahanap at pagpapalit ng teksto sa mga file na may sed ay napaka-simple.

Upang matuto nang higit pa tungkol sa mga sed utos, pagpipilian, at mga flag bisitahin ang GNU sed manual at Grymoire sed tutorial. Kung mayroon kang anumang mga katanungan o puna, huwag mag-iwan ng komento.

sed terminal