Answers:
sed -i 's/original/new/g' file.txt
පැහැදිලි කිරීම:
sed
= ධාරා සංස්කාරකය-i
= ස්ථානයේ (එනම් මුල් ගොනුවට නැවත සුරකින්න)විධාන string:
s
= ආදේශක විධානයoriginal
= ආදේශ කළ යුතු වචනය විස්තර කරන නිත්ය ප්රකාශනය (හෝ වචනය පමණක්)new
= එය ප්රතිස්ථාපනය කිරීමට පෙළg
= ගෝලීය (එනම් පළමු සිදුවීම පමණක් නොව සියල්ල ප්රතිස්ථාපනය කරන්න)file.txt
= ගොනුවේ නම
sed
ඔවුන් ගැලපෙන ඇත. -r
ඔබට ඒ වෙනුවට දීර් RE RE භාවිතා කිරීමට අවශ්ය නම් ධජයක් එක් කරන්න .
/
ඔබට ගැලපෙන චරිතය නම්, ඔබට වෙනත් අක්ෂරයක් බෙදුම්කරු ලෙස භාවිතා කළ හැකිය (උදා 's_old/text_new/text_g'
). එසේ නොමැති නම්, ඔබට වචනානුසාරයෙන්ම චරිතය ලබා ගැනීමට \
ඕනෑම කෙනෙකුට පෙරට යා හැකිය $ * . [ \ ^
.
sed -i '.bak' 's/original/new/g' file.txt
ශුන්ය දිග දිගුවක් සමඟ ධාවනය කළ හැකි sed -i '' 's/original/new/g' file.txt
අතර එමඟින් උපස්ථයක් ජනනය නොවේ.
මෙය කිරීමට විවිධ ක්රම ගණනාවක් තිබේ. එකක් භාවිතා කරන්නේ 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
cat
වල cat file | sed '...'
අනවශ්ය වේ. ඔබට කෙලින්ම පැවසිය හැකිය sed '...' file
.
sed -i'.bak' -e 's/unicorn/fox/g;s/hyper/brown/g' yarly
ගොනුව යාර්ලි ලෙස ගෙන උපස්ථයක් සිදුකරන අතරතුර ස්ථාන 2 ක් සිදු කරයි. time bash -c "$COMMAND"
වරින් වර භාවිතා කිරීමෙන් ඇඟවෙන්නේ මෙම අනුවාදය ~ 5 ගුණයක් වේගවත් බවයි.
එය සාක්ෂාත් කර ගැනීම සඳහා විවිධ ක්රම තිබේ. නූල් ප්රතිස්ථාපනය සමඟ යමෙකු සාක්ෂාත් කර ගැනීමට උත්සාහ කරන දේවල සංකීර්ණතාවය සහ පරිශීලකයා හුරුපුරුදු මෙවලම් මත පදනම්ව, සමහර ක්රම අනෙක් ඒවාට වඩා කැමති විය හැකිය.
මෙම පිළිතුරෙහි මම සරල 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, පෙළ සැකසුම් උපයෝගීතාවයක් වීම, එවැනි කාර්යයක් සඳහා බෙහෙවින් සුදුසු ය. නිත්ය ප්රකාශන මත පදනම්ව සරල ප්රතිස්ථාපන සහ වඩා දියුණු ඒවා කළ හැකිය . එය කාර්යයන් දෙකක් සපයයි: 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 '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()
ක්රියාකාරීත්වය ඇත, එය වඩාත් දියුණු ප්රතිස්ථාපන සඳහා භාවිතා කළ හැකිය.
tr
tr
තවත් විශිෂ්ට මෙවලමක් වන නමුත් එය අක්ෂර කට්ටල ආදේශ කිරීම සඳහා බව සලකන්න (නිදසුනක් ලෙස , යන්නට tr abc cde
පරිවර්තනය a
වනු ඇත . එය සම්පූර්ණ වචන වෙනුවට ආදේශ කිරීමට වඩා ටිකක් වෙනස් වේc
b
d
sed
python
ඔබට Vim in Ex මාදිලිය භාවිතා කළ හැකිය:
ex -s -c '%s/OLD/NEW/g|x' file
%
සියලුම පේළි තෝරන්න
s
ආදේශක
g
එක් එක් පේළියේ ඇති සියලුම අවස්ථා ප්රතිස්ථාපනය කරන්න
x
වෙනස්කම් සිදු කර ඇත්නම් ලියන්න (ඒවා තිබේ) පිටවීම
sed
නමුත් එය එල්ලෙන විට එය මගේ ssh සම්බන්ධතාවය කැටි කරයි. නිර්දේශ කළ නොහැක
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
inotifywait
යටතේ වන sh
අතර CSV ආකෘතියෙන් දත්ත වාර්තා කරන්නෙමි (අභිරුචි ආකෘතිය දෝෂ සහිත බැවින්). ෂෙල් ස්ක්රිප්ට් වල CSV ලේඛනය හැසිරවීමට සරල ක්රමයක් නොමැති බව මම පසුව තේරුම් ගතිමි ... මට එය ඉතා සැහැල්ලු විය යුතුය. CSV විග්රහ කිරීමට සහ වාර්තා කිරීමට මම තරමක් සරල පිටපතක් ආරම්භ කළෙමි. මම CSV පිරිවිතර කියවූ අතර එය මා බලාපොරොත්තු වූවාට වඩා විස්තාරණය කර ඇති අතර ද්විත්ව මිල ගණන් වලින් ඔතා ඇති බහු අගය සඳහා සහය දක්වයි. මම sed
ටෝකනකරණය සඳහා විශ්වාසය තැබූ නමුත් sed
බහු රේඛා ඇමතීම පවා පේළි දෙකක් දක්වා ඇති බව ඉක්මනින් අවබෝධ විය . මගේ CSV අගයන්ගෙන් එකක් පේළි දෙකකට වඩා වැඩි නම්, කුමක් කළ යුතුද?
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' අක්ෂරය සමඟ සෑම ගොනුවකම උපස්ථයක් සාදයි.
ඔබට මේ ආකාරයට කළ හැකිය:
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 මත භාවිතා කළ යුතු ලිපිගොනු සොයා ගන්නා බව සඳහන් කිරීම වටී, මන්ද එය ප්රශ්නයේ කොටසක් නොවන බැවිනි.