පෙළ ගොනුවකින්, නිශ්චිත පේළියක් අඩංගු සියලුම පේළි මකා දැමිය හැක්කේ කෙසේද?


Answers:


2786

රේඛාව ඉවත් කර ප්‍රතිදානය සම්මතයෙන් මුද්‍රණය කිරීම සඳහා:

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

13
ස්තූතියි, නමුත් එය ගොනුවෙන් මකා දැමූ බවක් නොපෙනේ, නමුත් එම නූලෙන් තොරව පෙළ ගොනු අන්තර්ගතය මුද්‍රණය කරන්න.
ඔරලෝසු තැඹිලි

115
C ඔරලෝසු වැඩ: ඔව්, ඔබට ප්‍රතිදානය නව ගොනුවකට හරවා sed '/pattern to match/d' ./infile > ./newfileයැවිය යුතුය. එසේ නැතහොත් ඔබට ස්ථානීය සංස්කරණයක් කිරීමට අවශ්‍ය නම් ඔබට -iධජය ඇතුලත් කිරීමට එකතු කළ හැකිය sed -i '/pattern to match/d' ./infile. -iධජයට GNU sed අවශ්‍ය වන අතර එය අතේ ගෙන යා නොහැකි බව සලකන්න
SiegeX

16
සමහර රසය සඳහා sed; sed හි "-i" ධජයට දිගුවක් සැපයිය යුතුය. (උදා sed -i.backup '/pattern to match/d' ./infile) එමඟින් ස්ථානීය සංස්කරණයන් මට හමු විය.
avelis

9
IeSiegeX වඩා හොඳ, sedඅනුවාදය පාලනය නොකරන ඕනෑම ගොනු වලට විධාන යොදන්න එපා .
MatrixFrog

84
මැක් ඕඑස් එක්ස් භාවිතා කරන්නන් සඳහා තවත් එක් සටහනක්: කිසියම් හේතුවක් නිසා -i ධජයට තර්කයක් සම්මත කිරීම අවශ්‍ය වේ, එය හිස් නූලක් වුවද sed -i '' '/pattern/d' ./infile.
geerlingguy

633

විශේෂිත නූල් සහිත රේඛා මකා දැමීමට තවත් බොහෝ ක්‍රම තිබේ sed:

AWK

awk '!/pattern/' file > temp && mv temp file

රූබි (1.9+)

ruby -i.bak -ne 'print if not /test/' file

පර්ල්

perl -ni.bak -e "print unless /pattern/" file

ෂෙල් (bash 3.2 සහ පසුව)

while read -r line
do
  [[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file

GNU grep

grep -v "pattern" file > temp && mv temp file

ඇත්ත වශයෙන්ම sed(ප්‍රතිලෝම මුද්‍රණය සත්‍ය මකාදැමීමට වඩා වේගවත් වේ):

sed -n '/pattern/!p' file

4
රටාවක් සහිත විශේෂිත පේළියක් සහ ඊට ඉහළින් ඇති රේඛාව මකා දැමිය හැක්කේ කෙසේද? විවිධ දත්ත අතර එවැනි රේඛා දහස් ගණනක් සමඟ මට දඩයක් තිබේ.
oortcloud_domicile

1
OS / X හි, ෂෙල් විචලනය ප්‍රමුඛ අවකාශයන් ආරක්ෂා නොකරයි, නමුත් grep -v විචලනය මට හොඳින් ක්‍රියාත්මක විය.
පෝල් බියුස්ටරියන්

13
මෙම sedඋදාහරණය වෙනස් හැසිරීම් ඇති, එය පමණක් greps! එය වැනි දෙයක් විය යුතුය sed -n -i '/pattern/!p' file.
සීසර්සෝල්

8
සෑම පේළියක්ම රටාවට ගැලපෙන විට grep අනුවාදය ක්‍රියා නොකරයි. වඩා හොඳ කරන්න: grep -v "pattern" file > temp; mv temp fileප්‍රතිලාභ අගය අනුව වෙනත් උදාහරණ කිහිපයකට මෙය අදාළ වේ.
ක්‍රිස් මේස්

1
"ප්‍රතිලෝම මුද්‍රණය සත්‍ය මකාදැමීමට වඩා වේගවත්ය" - මගේ යන්ත්‍රයේ නොවේ (2012 මැක්බුක් එයාර්, ඕඑස් එක්ස් 10.13.2). ගොනුව සාදන්න : 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. (කුඩා ලිපිගොනු සඳහා, වෙනස විශාල වේ.)
jcsahnwaldt මොනිකා නැවත ස්ථාපනය කරන්න

253

ගොනුවක ඇති රේඛා ආදේශ කිරීමට ඔබට sed භාවිතා කළ හැකිය. කෙසේ වෙතත්, ප්‍රතිලෝම සඳහා grep දෙවන ගොනුවකට භාවිතා කර දෙවන ගොනුව මුල් පිටපතට වඩා ගෙනයාමට වඩා එය මන්දගාමී බව පෙනේ.

උදා

sed -i '/pattern/d' filename      

හෝ

grep -v "pattern" filename > filename2; mv filename2 filename

පළමු විධානය කෙසේ හෝ මගේ යන්ත්‍රයට 3 ගුණයක් ගත වේ.


20
ඔබ කාර්ය සාධනය සංසන්දනය කිරීමට උත්සාහ කළ පමණින් ඔබේ පිළිතුර ද ඡන්දය ප්‍රකාශ කිරීම!
anuragw

4
වත්මන් ගොනුව grep රේඛාව සමඟ නැවත ලිවීමට විකල්පයක් ලබා දීම සඳහා +1.
රියුක්

2
දෙවන 'grep' විසඳුම විශාල ලිපිගොනු සඳහා ද වඩා හොඳය
simoes

3
කාර්ය සාධන වෙනස කුමක් වේ දැයි මට කුතුහලයක් ඇතsed '/pattern/d' filename > filename2; mv filename2 filename
පීට්

10
(උබුන්ටු / usr / share / dict / words භාවිතා කරමින්) grep සහ mv: 0.010s | sed ස්ථානය: 0.197s | sed සහ mv: 0.031s
ReactiveRaven

77

GNU සමඟ එය කිරීමට පහසුම ක්‍රමය sed:

sed --in-place '/some string here/d' yourfile

57
මෙම ප්‍රශ්නෝත්තර නූල් මත පැටලී සිටින සහ ෂෙල් ස්ක්‍රිප්ටින් කිරීම සඳහා අළුත් ඒවා සඳහා පහසු ඉඟියක්: විධාන රේඛාවේ එක් වරක් භාවිතා කිරීම සඳහා කෙටි විකල්පයන් කදිම ය, නමුත් ඒවා කියවිය හැකි බැවින් දිගු විකල්පයන් ස්ක්‍රිප්ට් වල වඩාත් කැමති විය යුතුය.
ඩෙනිස්

3
--In-place ධජය සඳහා +1. අවසර ආරක්ෂිත ලිපිගොනු වලින් මට එය පරීක්ෂා කිරීමට අවශ්‍යයි. (පරිශීලක සීරීම් කිහිපයක් කළ යුතුය.)
බී කේ

8
දිගු විකල්පය ලබා ගත හැක්කේ GNU sed මත පමණක් බව සලකන්න. මැක් සහ බීඑස්ඩී භාවිතා කරන්නන් මේ ආකාරයෙන් එය කිරීමට gsed ස්ථාපනය කළ යුතුය.
මතෙ

තවත් ඉඟියක්: ඔබේ රීජෙක්ස් ගැලපෙන්නේ -rනැතිනම් -E, විකල්පය උත්සාහ කරන්න (හෝ , ඔබේ අනුවාදය අනුව). මෙම regex metacharacters භාවිතය හැකියාව +, ?, {...}හා (...).
rjh

ඔබේ තැටියට වැඩි ඉඩක් නොමැති විට ඔබට නිවැරදි පිළිතුර මෙය වන අතර ඔබට වෙනත් ගොනුවකට පෙළ පිටපත් කළ නොහැක. මෙම විධානය මගින් ප්‍රශ්න කරන ලද දේ කරන්න?
ferreirabraga

39

ඔබට භාවිතා කිරීම සලකා බැලිය හැකිය 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 දිගු වන අතර ඒවා වෙනත් මෙහෙයුම් පද්ධතිවල නොතිබිය හැකිය.


5
ඒක නම් විශිෂ්ඨයි ... මම කරන විට man exඑය මට මිනිසා දෙන vim, එය පෙනේ ex... මම අදහස් සඳහා ආදර්ශය කාරක රීති අයිතිය බව තේරුම් නම් විම් කොටසක් matchවේ vimregex.com POSIX හා PCRE රස සමාන නමුත් වෙනස් වන?
ඇන්ට්‍රොපික්

1
:g යනු සුළු වෙනස්කම් සහිත POSIX- අනුකූල විධානයයි . මම හිතන්නේ PCRE ඒ මත පදනම් වූවක්.
kenorb

16

මම මැක් සමඟ මේ සමඟ පොරබදමින් සිටියෙමි. ප්ලස්, විචල්‍ය ප්‍රතිස්ථාපනය භාවිතයෙන් මට එය කිරීමට අවශ්‍ය විය.

එබැවින් මම භාවිතා කළෙමි:

sed -i '' "/$pattern/d" $file

එහිදී $fileඔබගේ පහසුව තකා මෙහි අවශ්ය හා කරනු ලබන ගොනුව $patternමකාදැමීමේ ගැලපෙන කිරීමට රටාව වේ.

මම ''මෙම අදහස් දැක්වීමෙන් තෝරා ගත්තා .

මෙහි සටහන් දේ භාවිතා කිරීම , උද්ධෘත පාඨ තුළ "/$pattern/d". අපි තනි උපුටා දැක්වීම් භාවිතා කරන විට විචල්‍යය ක්‍රියා නොකරනු ඇත.


3
මැක් sedහට පසුව පරාමිතියක් අවශ්‍ය වේ -i, එබැවින් ඔබට උපස්ථයක් අවශ්‍ය නොවන්නේ නම්, ඔබට තවමත් හිස් නූලක් එක් කළ යුතුය:-i ''
wisbucky

ෂෙල් භාවිතය සඳහා sed -i "/$pattern/d" $file. ඔබගේ පිළිතුරට ස්තූතියි.
ashwaqar

14

මම ආසන්න වශයෙන් පේළි 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

ඔබ සිටින්නේ කුමන වේදිකාවේද? ඔබ භාවිතා කරන්නේ sed / perl / grep හි කුමන අනුවාදයන්ද?
hagello

මම භාවිතා කරන වේදිකාව ලිනක්ස් (ජෙන්ටූ) ය. Sed අනුවාදය GNU sed v 4.2.2, perl version perl 5 (පරීක්ෂණය කරන අවස්ථාවේ දී මා භාවිතා කළේ කුමන සංශෝධනයදැයි මට කිව නොහැක), සහ grep (GNU) 3.0 අනුවාදය වේ.
ජඩ්සියා

14

ඔබට මෙයද භාවිතා කළ හැකිය:

 grep -v 'pattern' filename

මෙන්න -vමුද්‍රණය කරන්නේ ඔබේ රටාව හැරෙන්නට පමණි (එයින් අදහස් වන්නේ ප්‍රතිලෝම ගැලපීම).


නිශ්චිත නූලක් අඩංගු නාමාවලියක පේළි මකා දැමිය හැක්කේ කෙසේද
namannimmo

13

grepඔබ සමඟ ප්‍රති result ලයක් වැනි ස්ථානයක් ලබා ගැනීමට මෙය කළ හැකිය:

echo "$(grep -v "pattern" filename)" >filename

4
මෙය bashෂෙල් එකට පමණක් හෝ ඊට සමාන (නොවේ tcsh) පමණි.
පිටත් වන්න


4
perl -i    -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3

පළමු විධානය මඟින් ගොනුව (ය) ඇතුලත (-i) සංස්කරණය කරයි.

දෙවන විධානය එකම දේ කරන නමුත් .bk ගොනු නම් වලට එකතු කිරීමෙන් මුල් ගොනුවේ (ය) පිටපතක් හෝ උපස්ථයක් තබා ගනී (.bk ඕනෑම දෙයකට වෙනස් කළ හැකිය).



2

යමෙකුට හරියටම නූල් ගැලපීම් සඳහා එය කිරීමට අවශ්‍ය නම්, ඔබට -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 $.
සායි


0

ප්රතිකාර කළ පෙළ කොන්සෝලය තුළ පෙන්වීමට

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වරකට එක පිටුවේ කුට්ටි පෙළ පෙන්නුම් කරනු ඇත.


0

ඔබ හොඳ පැරණි භාවිතා කළ හැකිය edකිරීමට සමාන ආකාරයකට ගොනුව සංස්කරණය කිරීමට පිළිතුර බඹුන් ex. මෙම නඩුවේ ඇති විශාල වෙනස edනම්, එහි විධානයන් සම්මත ආදානය හරහා ගෙන යාම මිස විධාන රේඛා තර්ක ලෙස නොවේ ex. එය ස්ක්‍රිප්ට් එකක භාවිතා කරන විට, එයට අනුගත විය හැකි සාමාන්‍ය ක්‍රමය නම් printfඑයට විධාන පයිප්ප භාවිතා කිරීමයි:

printf "%s\n" "g/pattern/d" w | ed -s filename

හෝ පාරම්පරිකය සමඟ:

ed -s filename <<EOF
g/pattern/d
w
EOF
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.