විධාන භාවිතා කරමින් ගොනුවක් තුළ පෙළ සොයාගෙන ප්‍රතිස්ථාපනය කරන්න


Answers:


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

පැහැදිලි කිරීම:

  • sed = ධාරා සංස්කාරකය
  • -i = ස්ථානයේ (එනම් මුල් ගොනුවට නැවත සුරකින්න)
  • විධාන string:

    • s = ආදේශක විධානය
    • original = ආදේශ කළ යුතු වචනය විස්තර කරන නිත්‍ය ප්‍රකාශනය (හෝ වචනය පමණක්)
    • new = එය ප්‍රතිස්ථාපනය කිරීමට පෙළ
    • g = ගෝලීය (එනම් පළමු සිදුවීම පමණක් නොව සියල්ල ප්‍රතිස්ථාපනය කරන්න)
  • file.txt = ගොනුවේ නම


3
ඔබ ඇතුළත් නම් @Akiva regex විශේෂ අක්ෂර ඔබේ සෙවුම sedඔවුන් ගැලපෙන ඇත. -rඔබට ඒ වෙනුවට දීර් RE RE භාවිතා කිරීමට අවශ්‍ය නම් ධජයක් එක් කරන්න .
cscarney

34
cmcExchange එය /ඔබට ගැලපෙන චරිතය නම්, ඔබට වෙනත් අක්ෂරයක් බෙදුම්කරු ලෙස භාවිතා කළ හැකිය (උදා 's_old/text_new/text_g'). එසේ නොමැති නම්, ඔබට වචනානුසාරයෙන්ම චරිතය ලබා ගැනීමට \ ඕනෑම කෙනෙකුට පෙරට යා හැකිය $ * . [ \ ^.
cscarney

3
RianBrianZ ගොනු පද්ධතිය සම්බන්ධයෙන් ගත් කල, sed හි ප්‍රතිදානය එකම නමක් සහිත නව ගොනුවකි. එය දෝෂ නොවන පොදුවේ වාර්තා වූ දෝෂ වලින්
එකකි

20
OSX විධානය sed -i '.bak' 's/original/new/g' file.txtශුන්‍ය දිග දිගුවක් සමඟ ධාවනය කළ හැකි sed -i '' 's/original/new/g' file.txtඅතර එමඟින් උපස්ථයක් ජනනය නොවේ.
කිර්ක්

22
-I ed.gs/2016/01/26/os-x-sed-invalid-command-code සඳහා පරාමිතියක් ලෙස -i ට පසුව මැකෝස් පරිශීලකයින්ට '' "එකතු කිරීමට සිදුවනු ඇත, එවිට ගොනුව නැවත ලියනු ලැබේ.
භූගෝලීය

35

මෙය කිරීමට විවිධ ක්‍රම ගණනාවක් තිබේ. එකක් භාවිතා කරන්නේ sedසහ රීජෙක්ස් ය. SED යනු පෙළ පෙරීම සහ පරිවර්තනය කිරීම සඳහා ප්‍රවාහ සංස්කාරකයකි. එක් උදාහරණයක් පහත පරිදි වේ:

marco@imacs-suck: ~$ echo "The slow brown unicorn jumped over the hyper sleeping dog" > orly
marco@imacs-suck: ~$ sed s/slow/quick/ < orly > yarly
marco@imacs-suck: ~$ cat yarly
The quick brown unicorn jumped over the hyper sleeping dog

වඩා වැඩි තේරුමක් හැකි තවත් ක්රමයක් < strinහා > stroutපයිප්ප සමග වේ!

marco@imacs-suck: ~$ cat yarly | sed s/unicorn/fox/ | sed s/hyper/lazy/ > nowai
marco@imacs-suck: ~$ cat nowai 
The quick brown fox jumped over the lazy sleeping dog

6
මෙම සටහන් catවල cat file | sed '...'අනවශ්ය වේ. ඔබට කෙලින්ම පැවසිය හැකිය sed '...' file.
fedorqui

1
ඇත්ත වශයෙන්ම මෙය තව දුරටත් අඩු කළ හැකිය: sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarlyගොනුව යාර්ලි ලෙස ගෙන උපස්ථයක් සිදුකරන අතරතුර ස්ථාන 2 ක් සිදු කරයි. time bash -c "$COMMAND"වරින් වර භාවිතා කිරීමෙන් ඇඟවෙන්නේ මෙම අනුවාදය ~ 5 ගුණයක් වේගවත් බවයි.
pbhj

32

එය සාක්ෂාත් කර ගැනීම සඳහා විවිධ ක්‍රම තිබේ. නූල් ප්‍රතිස්ථාපනය සමඟ යමෙකු සාක්ෂාත් කර ගැනීමට උත්සාහ කරන දේවල සංකීර්ණතාවය සහ පරිශීලකයා හුරුපුරුදු මෙවලම් මත පදනම්ව, සමහර ක්‍රම අනෙක් ඒවාට වඩා කැමති විය හැකිය.

මෙම පිළිතුරෙහි මම සරල input.txtගොනුවක් භාවිතා කරමි , මෙහි දක්වා ඇති සියලුම උදාහරණ පරීක්ෂා කිරීමට ඔබට භාවිතා කළ හැකිය. ගොනු අන්තර්ගතය:

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

බාෂ්

බෑෂ් ඇත්ත වශයෙන්ම පෙළ සැකසීම සඳහා අදහස් නොකෙරේ, නමුත් සරල ආදේශක පරාමිති ප්‍රසාරණය හරහා කළ හැකිය , විශේෂයෙන් මෙහි අපට සරල ව්‍යුහයක් භාවිතා කළ හැකිය ${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

මෙම කුඩා ස්ක්‍රිප්ට් එක තැනින් තැන ප්‍රතිස්ථාපනය නොකරයි, එයින් අදහස් කරන්නේ ඔබට නව පෙළ නව ගොනුවකට සුරැකීමට සිදු වන අතර පැරණි ගොනුව ඉවත් කිරීමට හෝ mv new.txt old.txt

පැති සටහන: while IFS= read -r ; do ... done < input.txtභාවිතා කරන්නේ ඇයිද යන්න ගැන ඔබ කුතුහලයෙන් සිටී නම්, එය මූලික වශයෙන් ෂෙල්ගේ රේඛාව අනුව ලිපිගොනු කියවීමේ ක්‍රමයයි. යොමු කිරීම සඳහා මෙය බලන්න .

AWK

AWK, පෙළ සැකසුම් උපයෝගීතාවයක් වීම, එවැනි කාර්යයක් සඳහා බෙහෙවින් සුදුසු ය. නිත්‍ය ප්‍රකාශන මත පදනම්ව සරල ප්‍රතිස්ථාපන සහ වඩා දියුණු ඒවා කළ හැකිය . එය කාර්යයන් දෙකක් සපයයි: sub()සහ gsub(). පළමුවැන්න පළමු සිදුවීම පමණක් ප්‍රතිස්ථාපනය කරන අතර දෙවැන්න - සිදුවීම් සම්පූර්ණ නූලෙන් ප්‍රතිස්ථාපනය කරයි. උදාහරණයක් ලෙස, අපට නූල් තිබේ නම් one potato two potato, මෙය ප්‍රති result ලය වනු ඇත:

$ 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 හට ආදාන ගොනුවක් තර්කයක් ලෙස ගත හැකිය, එබැවින් එකම දේ කිරීම input.txtපහසුය:

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

ඔබ සතුව ඇති AWK අනුවාදය මත පදනම්ව, එය ස්ථානගත සංස්කරණයක් හෝ නොතිබිය හැකිය, එබැවින් සාමාන්‍ය පුරුද්ද වන්නේ නව පෙළ සුරැකීම සහ ප්‍රතිස්ථාපනය කිරීමයි. උදාහරණයක් ලෙස මේ වගේ දෙයක්:

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

SED

සෙඩ් යනු රේඛීය සංස්කාරකයෙකි. එය සාමාන්‍ය ප්‍රකාශන ද භාවිතා කරයි, නමුත් සරල ආදේශක සඳහා එය කිරීමට ප්‍රමාණවත් වේ:

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

මෙම මෙවලමෙහි ඇති හොඳ දෙය නම් එහි ස්ථානගත සංස්කරණයන් -iතිබීමයි , එය ඔබට ධජය සමඟ සක්‍රීය කළ හැකිය .

පර්ල්

පර්ල් යනු බොහෝ විට පෙළ සැකසීම සඳහා භාවිතා කරන තවත් මෙවලමකි, නමුත් එය පොදු අරමුණු සහිත භාෂාවක් වන අතර එය ජාලකරණය, පද්ධති පරිපාලනය, ඩෙස්ක්ටොප් යෙදුම් සහ තවත් බොහෝ ස්ථානවල භාවිතා වේ. එය C, sed, awk, සහ වෙනත් භාෂාවලින් සංකල්ප / විශේෂාංග රාශියක් ලබා ගත්තේය. සරල ආදේශනයක් එසේ කළ හැකිය:

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

Sed මෙන්, perl ද -i ධජය ඇත.

පයිතන්

මෙම භාෂාව ඉතා බහුකාර්ය වන අතර විවිධාකාර යෙදුම්වලද භාවිතා වේ. එය නූල් සමඟ වැඩ කිරීම සඳහා බොහෝ කාර්යයන් ඇත, ඒ අතර , ඔබට replace()වැනි විචල්‍යතාවයක් ඇත්නම් var="Hello World", ඔබට කළ හැකියvar.replace("Hello","Good Morning")

ගොනුව කියවීමට සහ එහි ඇති නූල් ප්‍රතිස්ථාපනය කිරීමට සරල ක්‍රමය එසේ වනු ඇත:

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

කෙසේ වෙතත්, පයිතන් සමඟ, ඔබට නව ගොනුවකට ප්‍රතිදානය කිරීමට අවශ්‍ය වන අතර, එය ඔබට ස්ක්‍රිප්ට් එකෙන්ම කළ හැකිය. උදාහරණයක් ලෙස, මෙන්න සරල එකක්:

#!/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])

මෙම ස්ක්‍රිප්ට් input.txtවිධාන රේඛා තර්කය ලෙස හැඳින්විය යුතුය . විධාන රේඛා පරාමිතිය සමඟ පයිතන් ස්ක්‍රිප්ට් ධාවනය කිරීමට නිශ්චිත විධානය වනු ඇත

 $ ./myscript.py input.txt

හෝ

$ python ./myscript.py input.txt

ඇත්ත වශයෙන්ම, ./myscript.pyඑය ඔබගේ වර්තමාන වැඩ කරන නාමාවලියෙහි ඇති බවට වග බලා ගන්න සහ පළමු ක්‍රමය නම්, එය ක්‍රියාත්මක කළ හැකි පරිදි සකසා ඇති බවට සහතික වන්නchmod +x ./myscript.py

පයිතන්ට නිත්‍ය ප්‍රකාශන තිබිය හැකිය, විශේෂයෙන් reමොඩියුලය ඇත, එහි re.sub()ක්‍රියාකාරීත්වය ඇත, එය වඩාත් දියුණු ප්‍රතිස්ථාපන සඳහා භාවිතා කළ හැකිය.


1
ලස්සන සම්පාදනය! මෙහි සඳහන් නොකළ හැකි තවත් ක්‍රමයක් වන්නේ tr
යුනික්ස්

1
Ap තපජිත් ඩේ ඔව්, tr තවත් විශිෂ්ට මෙවලමක් වන නමුත් එය අක්ෂර කට්ටල ආදේශ කිරීම සඳහා බව සලකන්න (නිදසුනක් ලෙස , යන්නට tr abc cdeපරිවර්තනය aවනු ඇත . එය සම්පූර්ණ වචන වෙනුවට ආදේශ කිරීමට වඩා ටිකක් වෙනස් වේcbdsedpython
සර්ජි කොලොඩියාෂ්නි

22

ඔබට Vim in Ex මාදිලිය භාවිතා කළ හැකිය:

ex -s -c '%s/OLD/NEW/g|x' file
  1. % සියලුම පේළි තෝරන්න

  2. s ආදේශක

  3. g එක් එක් පේළියේ ඇති සියලුම අවස්ථා ප්‍රතිස්ථාපනය කරන්න

  4. x වෙනස්කම් සිදු කර ඇත්නම් ලියන්න (ඒවා තිබේ) පිටවීම


බොහෝ සමාන sedනමුත් එය එල්ලෙන විට එය මගේ ssh සම්බන්ධතාවය කැටි කරයි. නිර්දේශ කළ නොහැක
y.selivonchyk

21

Awk ගේ gsub විධානය හරහා,

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

උදාහරණයක්:

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

ඉහත උදාහරණයේ දී, 1 තීරුව පිහිටා ඇති තීරුව නොසලකා 0 ගේ ප්‍රතිස්ථාපනය වේ.


ඔබට නිශ්චිත තීරුවක ආදේශනයක් කිරීමට අවශ්‍ය නම්, මේ ආකාරයට කරන්න,

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

උදාහරණයක්:

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

එය පළමු තීරුවේ පමණක් 1 සමඟ 0 ආදේශ කරයි.

පර්ල් හරහා,

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

මම මෙය මැකෝස් පර්යන්තයේ භාවිතා කළ අතර එය කිසිවක් කළේ නැත ...
ජිම්

ඇල්පයින් ලිනක්ස් (ඩොකර් බහාලුම්වල) පරීක්ෂා කර ඇති අතර ප්‍රතිදානයක් නොලැබුණි
සලාතියෙල් ජෙනීස්

@ සලාතියෙල් ජෙනීස් ඔබ අත්කර ගැනීමට උත්සාහ කරන්නේ කුමක්ද?
අවිනාශ් රාජ්

මම ගොනුව නරඹන්නේ env inotifywaitයටතේ වන shඅතර CSV ආකෘතියෙන් දත්ත වාර්තා කරන්නෙමි (අභිරුචි ආකෘතිය දෝෂ සහිත බැවින්). ෂෙල් ස්ක්‍රිප්ට් වල CSV ලේඛනය හැසිරවීමට සරල ක්‍රමයක් නොමැති බව මම පසුව තේරුම් ගතිමි ... මට එය ඉතා සැහැල්ලු විය යුතුය. CSV විග්‍රහ කිරීමට සහ වාර්තා කිරීමට මම තරමක් සරල පිටපතක් ආරම්භ කළෙමි. මම CSV පිරිවිතර කියවූ අතර එය මා බලාපොරොත්තු වූවාට වඩා විස්තාරණය කර ඇති අතර ද්විත්ව මිල ගණන් වලින් ඔතා ඇති බහු අගය සඳහා සහය දක්වයි. මම sedටෝකනකරණය සඳහා විශ්වාසය තැබූ නමුත් sedබහු රේඛා ඇමතීම පවා පේළි දෙකක් දක්වා ඇති බව ඉක්මනින් අවබෝධ විය . මගේ CSV අගයන්ගෙන් එකක් පේළි දෙකකට වඩා වැඩි නම්, කුමක් කළ යුතුද?
සලාතියෙල් ජෙනස්

ඔබේ ප්‍රශ්නය ප්‍රශ්නයක් ලෙස ඇසීම හොඳය.
අවිනාශ් රාජ්

10

sedයනු ගේ tream සංස් itor ඔබට භාවිතා කළ හැකි බව, |යැවීමට (නල) සම්මත ධාරා හරහා (STDIN හා STDOUT විශේෂයෙන්) sedඑය Unix දර්ශනය සම්ප්රදාය තුළ ඉතා ප්රයෝජනවත් මෙවලමක් ගැනීම, සහ පියාසර තහනම් මත programmatically ඔවුන් වෙනස් කිරීම; නමුත් -iපහත සඳහන් පරාමිතිය භාවිතා කරමින් කෙලින්ම ගොනු සංස්කරණය කළ හැකිය .
පහත සඳහන් කරුණු සලකා බලන්න :

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

s/කිරීම සඳහා භාවිතා වේ ගේ ද ප්රකාශනයක් සොයා ubstitute fewසමග asd:

ස්වල්ප දෙනෙක්, නිර්භීත ය.


සහකාර, නිර්භීත.

/g"ගෝලීය" යන්නෙන් අදහස් කරන්නේ, මුළු රේඛාව සඳහාම මෙය කිරීමයි. ඔබ ඉවත්ව ගියහොත් /g(සමග s/few/asd/, සෑම විටම කප්පාදු තුනක් තිබිය යුතුය) සහ fewඑකම පේළියේ දෙවරක් පෙනේ නම්, පළමුවැන්න fewපමණක් වෙනස් වන්නේ asd:

පිරිමින් ස්වල්පයක්, කාන්තාවන් ස්වල්පයක්, නිර්භීත ය.


සහකාර පිරිමින්, කාන්තාවන් ස්වල්පයක්, නිර්භීත ය.

පේළි ආරම්භයේ දී විශේෂ අක්ෂර වෙනස් කිරීම වැනි සමහර අවස්ථාවල මෙය ප්‍රයෝජනවත් වේ (නිදසුනක් ලෙස, ඊමේල් නූල්වල පෙර තොරතුරු උපුටා දැක්වීමට සමහරු භාවිතා කරන සංකේතවලට වඩා විශාල ප්‍රමාණයක් තිරස් පටිත්තකින් ප්‍රතිස්ථාපනය කරන අතර පසුව උපුටා ගත් වීජීය අසමානතාවය පසුව පේළියේ තබයි ස්පර්ශ නොකළ), නමුත් ඔබේ උදාහරණයේ කොතැනක හෝ few සිදුවීමක් ඇති බව ඔබ සඳහන් කළ විට එය ප්‍රතිස්ථාපනය කළ යුතුය, ඔබට එය ඇති බවට වග බලා ගන්න /g.

පහත සඳහන් විකල්ප දෙකක් (කොඩි), එකක් බවට සංකලනය වී ඇත -ie:

-iගොනුවේ i n ස්ථානය සංස්කරණය කිරීමට විකල්පය භාවිතා කරයි hello.txt.

-eවිකල්පය මඟින් මෙම අවස්ථාවෙහිදී ක්‍රියාත්මක වීමට e xpression / විධානය දක්වයි s/.

සටහන: -i -eසෙවීම / ප්‍රතිස්ථාපනය කිරීම සඳහා ඔබ භාවිතා කිරීම වැදගත්ය . ඔබ එසේ කරන්නේ නම් -ie, ඔබ 'e' අක්ෂරය සමඟ සෑම ගොනුවකම උපස්ථයක් සාදයි.


2

ඔබට මේ ආකාරයට කළ හැකිය:

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

උදාහරණ: ස්ථානගත කිරීමේ විධානයේ ප්‍රති result ලයක් ලෙස ඇති සියලුම ලිපිගොනු වල [logdir ',' '] ([] නොමැතිව) [logdir', os.getcwd ()] සමඟ ප්‍රතිස්ථාපනය කිරීමට, කරන්න:

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"

[tensorboard / program.py] සෙවීම සඳහා ගොනුවක් වේ


හායි. ඔබ තෝරාගත් නූල් ( logdir', ''-> /logdir', os.getcwd()) මෙම පිළිතුර විග්‍රහ කිරීමට අපහසු කරයි. එසේම, ඔබේ පිළිතුර මුලින්ම sed මත භාවිතා කළ යුතු ලිපිගොනු සොයා ගන්නා බව සඳහන් කිරීම වටී, මන්ද එය ප්‍රශ්නයේ කොටසක් නොවන බැවිනි.
mwfearnley

හායි, මෙම පිළිතුර සෙවුම වන අතර ගොනුවේ <පැරණි පෙළ> හමු වූවා නම් සියල්ල ප්‍රතිස්ථාපනය කරන්න.
Nguyễn Tuấn Anh

විධානය වෙනස් කිරීමට අවශ්‍ය කෙරස්හි ඔවුන් ටෙන්සර්බෝඩ් භාවිතා කරන සියල්ල සඳහා මම මෙම පිළිතුර තෝරා ගනිමි: tensorboard --logdir = '/ path / to / log / folder /' භාවිතා කිරීමට: tensorboard පමණක්, ලොග් ෆෝල්ඩරයේ රැඳී සිටින විට. එය ඉතා
Nguyễn Tuấn Anh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.