Tafuta na ubadilishe maandishi ndani ya faili ukitumia amri


Nenda kwa jibu lililokubaliwa


Ninawezaje kupata na kubadilisha maneno fulani kwenye faili ya maandishi kwa kutumia mstari wa amri?


680





2011-01-07




Idadi ya majibu: 7


 sed -i 's/original/new/g' file.txt
 

Maelezo:

  • sed = Mtiririshaji wa Mkondo
  • -i = mahali - (sema nyuma kwenye faili ya asili)
  • Kamba ya amri:

    • s = amri mbadala
    • original = usemi wa kawaida unaoelezea neno kuchukua nafasi ya (au neno tu lenyewe)
    • new = maandishi ili kuibadilisha
    • g = kimataifa (ie nafasi yote na sio tukio la kwanza tu)
  • file.txt = jina la faili


1106


2011-01-07

Kuna njia kadhaa tofauti za kufanya hivyo. Moja ni kutumia sed na Regex. SED ni Mhariri wa Utiririshaji wa vichungi na kubadilisha maandishi. Mfano mmoja ni kama ifuatavyo:

 [email protected]: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
[email protected]: ~$ sed s/slow/quick/ < orly > yarly
[email protected]: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog
 

Njia nyingine ambayo inaweza kufanya maana zaidi kuliko < strin na > strout iko na bomba!

 [email protected]: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
[email protected]: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog
 

34


2011-01-07

Kuna njia nyingi za kufanikisha hilo. Kulingana na ugumu wa kile mtu anajaribu kufikia na uingizwaji wa kamba, na kulingana na vifaa ambavyo mtumiaji anafahamika, njia zingine zinaweza kupendelewa zaidi kuliko zingine.

Katika jibu hili ninatumia input.txt faili rahisi , ambayo unaweza kutumia kujaribu mifano yote iliyotolewa hapa. Yaliyomo kwenye faili:

 roses are red , violets are blue
This is an input.txt and this doesn't rhyme
 

BASH

Bash haimaanishi sana usindikaji wa maandishi, lakini mbadala rahisi zinaweza kufanywa kupitia upanuzi wa paramu , haswa hapa tunaweza kutumia muundo rahisi ${parameter/old_string/new_string} .

 #!/bin/bash
while IFS= read -r line
do
    case "$line" in
       *blue*) printf "%s\n" "${line/blue/azure}" ;;
       *) printf "%s\n" "$line" ;;
    esac
done < input.txt
 

Hati hii ndogo haifanyi badala ya mahali, ikiwa na maana kwamba utalazimika kuhifadhi maandishi mpya kwa faili mpya, na uondoe faili ya zamani, au mv new.txt old.txt

Ujumbe wa upande: ikiwa una hamu ya kwanini while IFS= read -r ; do ... done < input.txt inatumiwa, kimsingi ni njia ya kusoma ya mstari kwa faili. Tazama hii kwa kumbukumbu.

AWK

AWK, kuwa shirika la usindikaji wa maandishi, inafaa kabisa kwa kazi kama hiyo. Inaweza kufanya mbadala rahisi na zile za juu zaidi kulingana na misemo ya kawaida . Inatoa kazi mbili: sub() na gsub() . Ya kwanza inachukua nafasi ya tukio la kwanza tu, wakati ya pili - inachukua nafasi ya kamba nzima. Kwa mfano, ikiwa tuna kamba one potato two potato , hii inaweza kuwa matokeo:

 $ echo "one potato two potato" | awk '{gsub(/potato/,"banana")}1'
one banana two banana

$ echo "one potato two potato" | awk '{sub(/potato/,"banana")}1'                                      
one banana two potato 
 

AWK inaweza kuchukua faili ya kuingiza hoja kama hoja, kwa hivyo kufanya mambo sawa na input.txt , itakuwa rahisi:

 awk '{sub(/blue/,"azure")}1' input.txt
 

Kulingana na toleo la AWK unayo, inaweza kuwa au isiwe na uhariri wa mahali, kwa hivyo mazoea ya kawaida ni kuhifadhi na kubadilisha maandishi mpya. Kwa mfano kitu kama hiki:

 awk '{sub(/blue/,"azure")}1' input.txt > temp.txt && mv temp.txt input.txt
 

SED

Sed ni mhariri wa mstari. Pia hutumia misemo ya kawaida, lakini kwa mbadala rahisi inatosha kufanya:

 sed 's/blue/azure/' input.txt
 

Ni nini mzuri juu ya zana hii ni kwamba ina uhariri wa mahali, ambayo unaweza kuwezesha na -i bendera.

Perl

Perl ni zana nyingine ambayo hutumiwa mara nyingi kwa usindikaji wa maandishi, lakini ni lugha ya kusudi la jumla, na hutumiwa katika mitandao, usimamizi wa mfumo, programu za desktop, na maeneo mengine mengi. Ilikopa dhana / huduma nyingi kutoka kwa lugha zingine kama C, sed, awk, na zingine. Uingizwaji rahisi unaweza kufanywa kama hivyo:

 perl -pe 's/blue/azure/' input.txt
 

Kama sed, perl pia ana bendera ya -i.

Python

Lugha hii ni anuwai na inatumika pia katika matumizi anuwai. Inayo kazi nyingi za kufanya kazi na kamba, kati ya ambayo ni replace() , kwa hivyo ikiwa utabadilika kama var="Hello World" , unaweza kufanya var.replace("Hello","Good Morning")

Njia rahisi ya kusoma faili na kubadilisha kamba ndani yake itakuwa kama hivi:

 python -c "import sys;lines=sys.stdin.read();print lines.replace('blue','azure')" < input.txt
 

Na Python, hata hivyo, unahitaji pia kutoa kwa faili mpya, ambayo unaweza pia kufanya kutoka kwa hati yenyewe. Kwa mfano, hapa kuna rahisi:

 #!/usr/bin/env python
import sys
import os
import tempfile

tmp=tempfile.mkstemp()

with open(sys.argv[1]) as fd1, open(tmp[1],'w') as fd2:
    for line in fd1:
        line = line.replace('blue','azure')
        fd2.write(line)

os.rename(tmp[1],sys.argv[1])
 

Nakala hii inapaswa kuitwa na input.txt hoja ya mstari wa amri. Amri halisi ya kuendesha hati ya python na hoja ya mstari wa amri itakuwa

  $ ./myscript.py input.txt
 

au

 $ python ./myscript.py input.txt
 

Kwa kweli, hakikisha kuwa ./myscript.py iko kwenye saraka yako ya sasa ya kufanya kazi na kwa njia ya kwanza, hakikisha imekamilishwa chmod +x ./myscript.py

Python pia inaweza kuwa na maneno ya kawaida, haswa, kuna re moduli, ambayo ina re.sub() kazi, ambayo inaweza kutumika kwa uingizwaji wa hali ya juu zaidi.


27


2017-02-03

Unaweza kutumia Vim katika hali ya Ex:

 ex -s -c '%s/OLD/NEW/g|x' file
 
  1. % chagua mistari yote

  2. s mbadala

  3. g badala ya mifano yote katika kila mstari

  4. x andika ikiwa mabadiliko yamefanywa (wanayo) na ya kutoka


22


2016-04-16

Kupitia amri ya gsub ya awk,

 awk '{gsub(/pattern/,"replacement")}' file
 

Mfano:

 awk '{gsub(/1/,"0");}' file
 

Katika mfano hapo juu, 1 yote hubadilishwa na 0 bila kujali safu ambayo iko.


Ikiwa unataka kubadilisha badala ya safu maalum, basi fanya kama hii,

 awk '{gsub(/pattern/,"replacement",column_number)}' file
 

Mfano:

 awk '{gsub(/1/,"0",$1);}' file
 

Inachukua nafasi ya 1 na 0 kwenye safu ya kwanza tu.

Kupitia Perl,

 $ echo 'foo' | perl -pe 's/foo/bar/g'
bar
 

21


2014-07-02

sed ni s Tream ed Itor , katika ambayo unaweza kutumia | (bomba) kwa kutuma kiwango mito (STDIN na STDOUT hasa) kupitia sed na kubadili yao kiprogramu ya kuruka, na kuifanya chombo Handy katika Unix falsafa utamaduni; lakini anaweza kuhariri faili moja kwa moja, pia, kwa kutumia -i paramu iliyotajwa hapo chini.
Fikiria yafuatayo :

 sed -i -e 's/few/asd/g' hello.txt
 

s/ hutumika s ubstitute kupatikana kujieleza few kwa asd :

Wachache, jasiri.


Asd, jasiri.

/g inasimama kwa "ulimwengu", ikiwa na maana ya kufanya hivyo kwa mstari mzima. Ukiachana na /g (na s/few/asd/ , kila wakati kunahitaji kuwa na mteremko tatu bila kujali) na few inaonekana mara mbili kwenye mstari huo huo, wa kwanza tu few ndio unabadilishwa kuwa asd :

Wanaume wachache, wanawake wachache, jasiri.


Wanaume wa asd, wanawake wachache, jasiri.

Hii ni muhimu katika hali zingine, kama kubadilisha herufi maalum mwanzoni mwa mistari (kwa mfano, kuchukua nafasi ya alama kubwa zaidi kuliko ambazo watu wengine hutumia kunukuu nyenzo za zamani kwenye vitambaa vya barua pepe na tabo usawa wakati wa kuacha usawa wa algebraic baadaye kwenye mstari haijashughulikiwa), lakini katika mfano wako ambapo unabainisha kuwa mahali pote few panapotokea inapaswa kubadilishwa, hakikisha unayo hiyo /g .

Zifuatazo chaguzi mbili (bendera) ni pamoja katika moja, -ie :

-i chaguo ni kutumika kwenye mabadiliko i n mahali kwenye faili hello.txt .

-e chaguo inaonyesha e xpression / amri ya kukimbia, katika kesi hii s/ .

Kumbuka: Ni muhimu utumie -i -e kutafuta / kubadilisha. Ukifanya hivyo -ie , unaunda nakala rudufu ya kila faili iliyo na barua 'e' iliyoongezwa.


8


2017-11-23

Unaweza kufanya kama hii:

 locate <part of filaname to locate> | xargs sed -i -e "s/<Old text>/<new text>/g" 
 

Mifano: kuchukua nafasi ya kutokea [logdir ',' '] (bila []) na [logdir', os.getcwd ()] kwenye faili zote ambazo ni matokeo ya amri ya Machapisho.

ex1:

 locate tensorboard/program.py | xargs sed -i -e "s/old_text/NewText/g"
 

ex2:

 locate tensorboard/program.py | xargs sed -i -e "s/logdir', ''/logdir', os.getcwd()/g"
 

ambapo [tensorboard / program.py] ni faili ya kutafuta


2


2018-07-24