විශේෂිත නූලක් අඩංගු පෙළ ගොනුවක ඇති සියලුම පේළි මකා දැමීමට මම sed භාවිතා කරන්නේ කෙසේද?
විශේෂිත නූලක් අඩංගු පෙළ ගොනුවක ඇති සියලුම පේළි මකා දැමීමට මම sed භාවිතා කරන්නේ කෙසේද?
Answers:
රේඛාව ඉවත් කර ප්රතිදානය සම්මතයෙන් මුද්රණය කිරීම සඳහා:
sed '/pattern to match/d' ./infile
ගොනුව කෙලින්ම වෙනස් කිරීමට - BSD sed සමඟ ක්රියා නොකරයි:
sed -i '/pattern to match/d' ./infile
එකම, නමුත් BSD sed (Mac OS X සහ FreeBSD) සඳහා - GNU sed සමඟ ක්රියා නොකරයි:
sed -i '' '/pattern to match/d' ./infile
ගොනුව කෙලින්ම වෙනස් කිරීමට (සහ උපස්ථයක් සාදන්න) - BSD සහ GNU sed සමඟ ක්රියා කරයි:
sed -i.bak '/pattern to match/d' ./infile
sed '/pattern to match/d' ./infile > ./newfile
යැවිය යුතුය. එසේ නැතහොත් ඔබට ස්ථානීය සංස්කරණයක් කිරීමට අවශ්ය නම් ඔබට -i
ධජය ඇතුලත් කිරීමට එකතු කළ හැකිය sed -i '/pattern to match/d' ./infile
. -i
ධජයට GNU sed අවශ්ය වන අතර එය අතේ ගෙන යා නොහැකි බව සලකන්න
sed -i.backup '/pattern to match/d' ./infile
) එමඟින් ස්ථානීය සංස්කරණයන් මට හමු විය.
sed
අනුවාදය පාලනය නොකරන ඕනෑම ගොනු වලට විධාන යොදන්න එපා .
sed -i '' '/pattern/d' ./infile
.
විශේෂිත නූල් සහිත රේඛා මකා දැමීමට තවත් බොහෝ ක්රම තිබේ sed
:
awk '!/pattern/' file > temp && mv temp file
ruby -i.bak -ne 'print if not /test/' file
perl -ni.bak -e "print unless /pattern/" file
while read -r line
do
[[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file
grep -v "pattern" file > temp && mv temp file
ඇත්ත වශයෙන්ම sed
(ප්රතිලෝම මුද්රණය සත්ය මකාදැමීමට වඩා වේගවත් වේ):
sed -n '/pattern/!p' file
sed
උදාහරණය වෙනස් හැසිරීම් ඇති, එය පමණක් greps! එය වැනි දෙයක් විය යුතුය sed -n -i '/pattern/!p' file
.
grep -v "pattern" file > temp; mv temp file
ප්රතිලාභ අගය අනුව වෙනත් උදාහරණ කිහිපයකට මෙය අදාළ වේ.
seq -f %f 10000000 >foo.txt
. sed d: time sed -i '' '/6543210/d' foo.txt
තාත්වික 0m9.294s. sed! p: time sed -i '' -n '/6543210/!p' foo.txt
තාත්වික 0m13.671s. (කුඩා ලිපිගොනු සඳහා, වෙනස විශාල වේ.)
ගොනුවක ඇති රේඛා ආදේශ කිරීමට ඔබට sed භාවිතා කළ හැකිය. කෙසේ වෙතත්, ප්රතිලෝම සඳහා grep දෙවන ගොනුවකට භාවිතා කර දෙවන ගොනුව මුල් පිටපතට වඩා ගෙනයාමට වඩා එය මන්දගාමී බව පෙනේ.
උදා
sed -i '/pattern/d' filename
හෝ
grep -v "pattern" filename > filename2; mv filename2 filename
පළමු විධානය කෙසේ හෝ මගේ යන්ත්රයට 3 ගුණයක් ගත වේ.
sed '/pattern/d' filename > filename2; mv filename2 filename
GNU සමඟ එය කිරීමට පහසුම ක්රමය sed
:
sed --in-place '/some string here/d' yourfile
-r
නැතිනම් -E
, විකල්පය උත්සාහ කරන්න (හෝ , ඔබේ අනුවාදය අනුව). මෙම regex metacharacters භාවිතය හැකියාව +
, ?
, {...}
හා (...)
.
ඔබට භාවිතා කිරීම සලකා බැලිය හැකිය ex
(එය සම්මත යුනික්ස් විධාන පාදක සංස්කාරකයකි):
ex +g/match/d -cwq file
කොහේද:
+
ලබා දී ඇති Ex විධානය ( man ex
) -c
ක්රියාත්මක කරන ආකාරයටම wq
(ලිවීම සහ ඉවත් වීම)g/match/d
- ලබා දී ඇති රේඛා මකා දැමීමට Ex විධානය match
, බලන්න: g හි බලයඉහත උදාහරණයේ-ස්ථානය ගොනුව මෙම පරිදි සංස්කරණය සඳහා POSIX-අනුකූල ක්රමයක් වේ Unix.SE තැපැල් හා සඳහා POSIX පිරිවිතරex
.
මෙහි ඇති වෙනස sed
එයයි:
sed
යනු එස් tream ED itor, ගොනු කර්තෘ නොවේ. BashFAQ
ඔබ විසින් කළ නොහැකි කේතයක් භුක්ති විඳින්නේ නැත්නම්, I / O පොදු කාර්ය සහ වෙනත් නරක අතුරු ආබාධ. එබැවින් මූලික වශයෙන් සමහර පරාමිතීන් (ස්ථානයේ / වැනි -i
) සම්මත නොවන FreeBSD දිගු වන අතර ඒවා වෙනත් මෙහෙයුම් පද්ධතිවල නොතිබිය හැකිය.
man ex
එය මට මිනිසා දෙන vim
, එය පෙනේ ex
... මම අදහස් සඳහා ආදර්ශය කාරක රීති අයිතිය බව තේරුම් නම් විම් කොටසක් match
වේ vimregex.com POSIX හා PCRE රස සමාන නමුත් වෙනස් වන?
මම මැක් සමඟ මේ සමඟ පොරබදමින් සිටියෙමි. ප්ලස්, විචල්ය ප්රතිස්ථාපනය භාවිතයෙන් මට එය කිරීමට අවශ්ය විය.
එබැවින් මම භාවිතා කළෙමි:
sed -i '' "/$pattern/d" $file
එහිදී $file
ඔබගේ පහසුව තකා මෙහි අවශ්ය හා කරනු ලබන ගොනුව $pattern
මකාදැමීමේ ගැලපෙන කිරීමට රටාව වේ.
මම ''
මෙම අදහස් දැක්වීමෙන් තෝරා ගත්තා .
මෙහි සටහන් දේ භාවිතා කිරීම , උද්ධෘත පාඨ තුළ "/$pattern/d"
. අපි තනි උපුටා දැක්වීම් භාවිතා කරන විට විචල්යය ක්රියා නොකරනු ඇත.
sed
හට පසුව පරාමිතියක් අවශ්ය වේ -i
, එබැවින් ඔබට උපස්ථයක් අවශ්ය නොවන්නේ නම්, ඔබට තවමත් හිස් නූලක් එක් කළ යුතුය:-i ''
sed -i "/$pattern/d" $file
. ඔබගේ පිළිතුරට ස්තූතියි.
මම ආසන්න වශයෙන් පේළි 345 000 ක් අඩංගු ගොනුවක් සහිත කුඩා මිණුම් ලකුණක් සාදා ඇත. සමග මාර්ගය grep
වඩා 15 ගුනයක වේගයකින් බව පෙනේ sed
මෙම නඩුවේ ක්රමය.
LC_ALL = C සැකසුම සමඟ සහ නැතිව මම උත්සාහ කර ඇත, එය කාලය සැලකිය යුතු ලෙස වෙනස් කරන බවක් නොපෙනේ. සෙවුම් දාමය (CDGA_00004.pdbqt.gz.tar) ගොනුවේ මැද කොතැනක හෝ තිබේ.
මෙන්න විධාන සහ වේලාවන්:
time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt
real 0m0.711s
user 0m0.179s
sys 0m0.530s
time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt
real 0m0.105s
user 0m0.088s
sys 0m0.016s
time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )
real 0m0.046s
user 0m0.014s
sys 0m0.019s
ඔබට මෙයද භාවිතා කළ හැකිය:
grep -v 'pattern' filename
මෙන්න -v
මුද්රණය කරන්නේ ඔබේ රටාව හැරෙන්නට පමණි (එයින් අදහස් වන්නේ ප්රතිලෝම ගැලපීම).
grep
ඔබ සමඟ ප්රති result ලයක් වැනි ස්ථානයක් ලබා ගැනීමට මෙය කළ හැකිය:
echo "$(grep -v "pattern" filename)" >filename
bash
ෂෙල් එකට පමණක් හෝ ඊට සමාන (නොවේ tcsh
) පමණි.
perl -i -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3
පළමු විධානය මඟින් ගොනුව (ය) ඇතුලත (-i) සංස්කරණය කරයි.
දෙවන විධානය එකම දේ කරන නමුත් .bk ගොනු නම් වලට එකතු කිරීමෙන් මුල් ගොනුවේ (ය) පිටපතක් හෝ උපස්ථයක් තබා ගනී (.bk ඕනෑම දෙයකට වෙනස් කළ හැකිය).
යමෙකුට හරියටම නූල් ගැලපීම් සඳහා එය කිරීමට අවශ්ය නම්, ඔබට -w
ධජය grep - w ලෙස භාවිතා කළ හැකිය . එනම්, උදාහරණයක් ලෙස ඔබට අංක 11 ඇති පේළි මකා දැමීමට අවශ්ය නම්, නමුත් අංක 111 සමඟ පේළි තබා ගන්න:
-bash-4.1$ head file
1
11
111
-bash-4.1$ grep -v "11" file
1
-bash-4.1$ grep -w -v "11" file
1
111
-f
ඔබට එකවර නිශ්චිත රටා කිහිපයක් බැහැර කිරීමට අවශ්ය නම් එය ධජය සමඟ ක්රියා කරයි . "අසාදු ලේඛනය" යනු "ගොනුව" වෙතින් මකා දැමීමට අවශ්ය එක් එක් පේළියේ රටා කිහිපයක් සහිත ගොනුවක් නම්:
grep -w -v -f blacklist file
-w, --word-regexp Select only those lines containing matches that form whole words.
එදිරිව-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
cat filename | grep -v "pattern" > filename.1
mv filename.1 filename
ප්රතිකාර කළ පෙළ කොන්සෝලය තුළ පෙන්වීමට
cat filename | sed '/text to remove/d'
ප්රතිකාර කළ පෙළ ගොනුවකට සුරැකීමට
cat filename | sed '/text to remove/d' > newfile
පවතින පෙළ ගොනුවක් එකතු කිරීමට
cat filename | sed '/text to remove/d' >> newfile
දැනටමත් ප්රතිකාර කළ පෙළට ප්රතිකාර කිරීම සඳහා, මෙම අවස්ථාවේ දී ඉවත් කර ඇති දේවල තවත් පේළි ඉවත් කරන්න
cat filename | sed '/text to remove/d' | sed '/remove this too/d' | more
මෙම | more
වරකට එක පිටුවේ කුට්ටි පෙළ පෙන්නුම් කරනු ඇත.
ඔබ හොඳ පැරණි භාවිතා කළ හැකිය ed
කිරීමට සමාන ආකාරයකට ගොනුව සංස්කරණය කිරීමට පිළිතුර බඹුන් ex
. මෙම නඩුවේ ඇති විශාල වෙනස ed
නම්, එහි විධානයන් සම්මත ආදානය හරහා ගෙන යාම මිස විධාන රේඛා තර්ක ලෙස නොවේ ex
. එය ස්ක්රිප්ට් එකක භාවිතා කරන විට, එයට අනුගත විය හැකි සාමාන්ය ක්රමය නම් printf
එයට විධාන පයිප්ප භාවිතා කිරීමයි:
printf "%s\n" "g/pattern/d" w | ed -s filename
හෝ පාරම්පරිකය සමඟ:
ed -s filename <<EOF
g/pattern/d
w
EOF