Sh ස්ක්‍රිප්ට් එකක sed භාවිතා කරන විට මට පැන යාමට අවශ්‍ය චරිත මොනවාද?


275

පහත පිටපත ගන්න:

#!/bin/sh
sed 's/(127\.0\.1\.1)\s/\1/' [some file]

මම මෙය sh( dashමෙහි) ක්‍රියාත්මක කිරීමට උත්සාහ කළහොත් , වරහන් වර්‍ග නිසා එය අසාර්ථක වනු ඇත, එයින් ගැලවිය යුතුය. නමුත් මට බැක්ස්ලෑෂ් වලින් ගැලවීමට අවශ්‍ය නැත (අෂ්ටක අතර, හෝ \sහෝ \1). මෙහි නීතිය කුමක්ද? මට භාවිතා කිරීමට අවශ්‍ය වූ විට {...}හෝ [...]කුමක් කළ යුතුද? මා කරන දේ ලැයිස්තුවක් තිබේද?


1
SED සමඟ භාවිතා කිරීම සඳහා මාර්ග පරිවර්තනය කිරීම සඳහා වූ function sedPath { path=$((echo $1|sed -r 's/([\$\.\*\/\[\\^])/\\\1/g'|sed 's/[]]/\[]]/g')>&1) } #Escape path for use with sed
කඩිනම් කාර්යයක් මෙන්න


Dura lex, sed sed
Nemo

Answers:


313

මෙහි අර්ථ නිරූපණ මට්ටම් දෙකක් ඇත: කවචය සහ sed.

කවචයේ, තනි උපුටා දැක්වීම් අතර ඇති සෑම දෙයක්ම වචනාර්ථයෙන් අර්ථ නිරූපණය කෙරේ. ලිවීමෙන් ඔබට තනි උපුටා දැක්වීම් අතර තනි උපුටා දැක්වීමක් effectively ලදායී ලෙස කළ හැකිය '\''(සමීප තනි උපුටා දැක්වීමක්, එක් වචනාර්ථයක් තනි උපුටා දැක්වීමක්, විවෘත තනි උපුටා දැක්වීමක්).

සෙඩ් මූලික නිත්‍ය ප්‍රකාශන භාවිතා කරයි . BRE හි, ඔවුන්ට වචනාර්ථයෙන් සලකනු පිණිස $.*[\^, අක්ෂර අක්ෂර කට්ටල ( […]) ඇතුළත හැර, බැක්ස්ලෑෂ් මඟින් පෙර සඳහන් කිරීමෙන් උපුටා දැක්විය යුතුය . අකුරු, ඉලක්කම් සහ (){}+?|උපුටා දැක්විය යුතු නොවේ (සමහර ක්‍රියාත්මක කිරීම් වලදී මේවායින් සමහරක් උපුටා දැක්වීමෙන් ඔබට ගැලවිය හැකිය). මෙම අනුක්රමය \(, \), \n, හා සමහර නිර්මාණයන් තුළ \{, \}, \+, \?, \|සහ අනෙකුත් පදයේ අග + අක්ෂර සංඛ්යා විශේෂ අදහසක් ඇත. $^සමහර ක්‍රියාත්මක කිරීම් වලදී සමහර තනතුරු වල සඳහන් නොකිරීමෙන් ඔබට ගැලවිය හැකිය .

තව දුරටත්, /වරහන් ප්‍රකාශන වලින් පිටත රීජෙක්ස් හි දර්ශනය වීමට පෙර ඔබට බැක්ස්ලෑෂ් අවශ්‍ය වේ. ලිවීමෙන් ඔබට පරිමිතිය ලෙස විකල්ප චරිතයක් තෝරා ගත හැකිය, උදා, s~/dir~/replacement~හෝ \~/dir~p; ඔබට එය BRE තුළට ඇතුළත් කිරීමට අවශ්‍ය නම් පරිසීමාවට පෙර බැක්ස්ලෑෂ් එකක් අවශ්‍ය වේ. ඔබ BRE හි විශේෂ අරුතක් ඇති චරිතයක් තෝරාගෙන එය වචනාර්ථයෙන් ඇතුළත් කිරීමට අවශ්‍ය නම්, ඔබට බැක්ස්ලෑෂ් තුනක් අවශ්‍ය වේ; සමහර ක්‍රියාත්මක කිරීම් වලදී එය වෙනස් ලෙස හැසිරෙන බැවින් මම මෙය නිර්දේශ නොකරමි.

කෙටියෙන් කිවහොත්, සඳහා sed 's/…/…/':

  • තනි උපුටා දැක්වීම් අතර රීජෙක්ස් ලියන්න.
  • '\''රීජෙක්ස් හි තනි උපුටා දැක්වීමකින් අවසන් කිරීමට භාවිතා කරන්න .
  • පෙර බැක්ස්ලෑෂ් එකක් දමන්න $.*/[\]^සහ එම අක්ෂර පමණක් (නමුත් වරහන් ප්‍රකාශන තුළ නොවේ). (තාක්ෂණික ඔබ පෙර පදයේ අග තබා යුතු නැහැ ], නමුත් මම ඒ සිනා සීමට ක ක්රියාත්මක දන්නේ නැහැ ]හා \]වෙනස් පිටත වරහන ප්රකාශනයන්.)
  • වරහන් ප්‍රකාශනයක් ඇතුළත, -වචනාර්ථයෙන් සැලකීමට නම්, එය පළමු හෝ අවසාන ( [abc-]හෝ [-abc], නොවේ [a-bc]) බවට වග බලා ගන්න .
  • වරහන් ප්‍රකාශනයක් ඇතුළත, ^වචනාර්ථයෙන් සැලකීමට නම්, එය පළමුව නොවන බවට වග බලා ගන්න (භාවිතා කරන්න [abc^], නැත [^abc]).
  • ]වරහන් ප්‍රකාශනයකට ගැලපෙන අක්‍ෂර ලැයිස්තුවට ඇතුළත් කිරීම සඳහා, එය පළමු අක්‍ෂරය බවට පත් කරන්න (හෝ ^නොසලකා හරින ලද කට්ටලයක් සඳහා පළමුව ): []abc]හෝ [^]abc](නැත [abc]]හෝ නැත[abc\]] ).

ආදේශන පා text යේ:

  • &හා \බැක්ස්ලෑෂයක් ඔවුන්ට පෙර විසින් උපුටා දක්වන කළ යුතු අතර, ලෙස පරිසීමක (සාමාන්යයෙන් කරන්න /) සහ හිස් පේලි ගැන.
  • \ඉලක්කම් අනුගමනය කිරීමෙන් විශේෂ අර්ථයක් ඇත. \ලිපියකින් පසුව සමහර ක්‍රියාත්මක කිරීම් වලදී විශේෂ අරුතක් (විශේෂ අක්ෂර) ඇති අතර, \පසුව වෙනත් අක්ෂර මාධ්‍යයන් \cහෝ cක්‍රියාත්මක කිරීම මත පදනම්ව.
  • ( sed 's/…/…/') තර්කය වටා තනි උපුටා දැක්වීම් සමඟ '\'', ආදේශන පා in යට තනි උපුටා දැක්වීමක් කිරීමට භාවිතා කරන්න.

රීජෙක්ස් හෝ ප්‍රතිස්ථාපන පෙළ ලැබෙන්නේ ෂෙල් විචල්‍යයකින් නම්, එය මතක තබා ගන්න

  • රීජෙක්ස් යනු BRE මිස වචනාර්ථමය නූලක් නොවේ.
  • රීජෙක්ස් හි, නව රේඛාවක් ලෙස ප්‍රකාශ කළ යුතුය \n( sedරටා අවකාශයට නව රේඛා අක්ෂර එකතු කරන වෙනත් කේතයක් නොමැති නම් එය කිසි විටෙකත් නොගැලපේ ). නමුත් සමහර sedක්‍රියාත්මක කිරීම් සමඟ වරහන් ප්‍රකාශන තුළ එය ක්‍රියා නොකරන බව සලකන්න .
  • ආදේශන පා In යේ &, \සහ නව රේඛා උපුටා දැක්විය යුතුය.
  • පරිසීමකය උපුටා දැක්විය යුතුය (නමුත් වරහන් ප්‍රකාශන තුළ නොවේ).
  • අන්තර් මැදිහත්වීම සඳහා ද්විත්ව මිල ගණන් භාවිතා කරන්න : sed -e "s/$BRE/$REPL/".

1
සත්‍ය ආදේශක අක්‍ෂරයෙන් ගැලවීම (*) ඔබට ද්විත්ව බැක්ස්ලෑෂ් ( \\*) භාවිතා කළ හැකිය . උදාහරණය:echo "***NEW***" | sed /\\*\\*\\*NEW\\*\\*\\*/s/^/#/
අනතුර 89

"රීජෙක්ස් හි තනි උපුටා දැක්වීමකින් අවසන් වීමට '\' 'භාවිතා කරන්න." මැකෝස් කැටලිනා හි මා වෙනුවෙන් වැඩ කළේ නැත. මට ද්විත්ව උපුටා දැක්වීම් භාවිතා කර තනි උපුටා දැක්වීම් ඇතුලත් කිරීමට සිදුවිය. බැක්ස්ලෑෂ් 0-2 අතර සියල්ල උත්සාහ කළා.
ෆ්ලෝරියන් වෙන්ඩල්බර්න්

45

ඔබ අත්විඳින ගැටළුව ෂෙල් අන්තර් මැදිහත්වීම සහ පැන යාම නිසා නොවේ - එයට හේතුව ඔබ විකල්පය -rහෝ --regexp-extendedවිකල්පය නොගෙන දීර් extended නිත්‍ය ප්‍රකාශන වාක්‍ය ඛණ්ඩයක් භාවිතා කිරීමට උත්සාහ කිරීමයි .

සිට ඔබේ sed රේඛාව වෙනස් කරන්න

sed 's/(127\.0\.1\.1)\s/\1/' [some file]

වෙත

sed -r 's/(127\.0\.1\.1)\s/\1/' [some file]

ඔබ විශ්වාස කරන පරිදි එය ක්‍රියාත්මක වනු ඇත.

පෙරනිමියෙන් sed භාවිතයන් මූලික නිත්‍ය ප්‍රකාශන භාවිතා කරයි (සිතන්න grep style), පහත සඳහන් වාක්‍ය ඛණ්ඩය අවශ්‍ය වේ:

sed 's/\(127\.0\.1\.1\)[ \t]/\1/' [some file]

මට නැවත මෙම ගැටලුව ඇති වූ අතර, අවසන් වරට මා විසින් ඉදිරිපත් කරන ලද විසඳුම සෙවීම සඳහා පහළට අනුචලනය කිරීමට අමතක විය. නැවත ස්තූතියි.
isaaclw

ගොඩක් ස්තුතියි. -rවිකල්පයක් ලෙස එකතු කිරීම මගේ නඩුවේ අවශ්‍ය දේ විය.
HelloGoodbye


භාවිතා කරමින් @HubertGrzeskowiak -EMacOS මත සමාන උපක්රමය කළේ -r ඒ දැක
ෆීලික්ස්

බොහෝ උපුටා දැක්වීම් භාවිතා කරමින් දෘශ්‍ය ශබ්දය ලිහිල් කිරීම සඳහා උපුටා දැක්වීම් වෙනුවට # බෙදුම්කරුවෙකු ලෙස භාවිතා කිරීම ප්‍රයෝජනවත් විය හැකිය
jouell

18

ඔබට ෂෙල් විචල්‍යය sed ප්‍රකාශනයට අන්තර්ග්‍රහණය කිරීමට අවශ්‍ය නොවන්නේ නම්, සම්පූර්ණ ප්‍රකාශනය සඳහා තනි උපුටා දැක්වීම් භාවිතා කරන්න, මන්ද ඒවා අතර ඇති සෑම දෙයක්ම බැක්ස්ලෑෂ් ද ඇතුළුව අර්ථ නිරූපණය කිරීමට හේතු වේ.

එබැවින් ඔබට s/\(127\.0\.1\.1\)\s/\1/එය වටා තනි උපුටා දැක්වීම් කිරීමට අවශ්‍ය නම් සහ කවචය එහි වරහන් හෝ බැක්ස්ලෑෂ් ස්පර්ශ නොකරනු ඇත. ඔබට ෂෙල් විචල්‍යයක් අන්තර්ග්‍රහණය කිරීමට අවශ්‍ය නම්, එම කොටස ද්විත්ව උපුටා දැක්වීම් වලට දමන්න. උදා

sed 's/\(127\.0\.1\.1\)/'"$ip"'/'

ද්විත්ව උපුටා දැක්වීම් වලින් ගැලවී නැති ෂෙල් මෙටාචරැක්ටර්ස් මතක තබා ගැනීමේ කරදරය මෙය ඔබට ඉතිරි කරයි.


මට ඕන sedබලන්න s/(127\.0\.1\.1)/..., නමුත් ෂෙල් තිර රචනය බව දමා වැනි ය වැඩ කරන්නේ නැහැ. වරහන වරහන් ස්පර්ශ නොකිරීම ගැන ඔබ පවසන දේ වැරදියි. මම මගේ ප්‍රශ්නය විස්තාරණය කිරීමට සංස්කරණය කර ඇත්තෙමි.
detly

3
කවචය වරහන් වර්‍ග ස්පර්ශ නොකරයි. ඔබට බැක්ස්ලේස් අවශ්‍ය වන්නේ sed ඒවා දැකීමට අවශ්‍ය නිසාය. sed 's/(127\.0\.1\.1)/IP \1/'අසමත් වන්නේ sed දැකීමට \(සහ \)කණ්ඩායම් සින්ටැක්ස් සඳහා අවශ්‍ය වන නිසා නොව, (සහ ).
කයිල් ජෝන්ස්

facepalm එය මෑන් පිටුවේ නැත, නමුත් එය මා විසින් සොයාගත් සමහර මාර්ගගත අත්පොතෙහි ඇත. රීජෙක්ස් සඳහා මෙය සාමාන්‍ය දෙයක්ද, මන්ද යත් මට එය කවදාවත් රීජෙක්ස් පුස්තකාලවල භාවිතා කිරීමට සිදු නොවූ නිසාය (දී, උදා: පයිතන්)?
detly

3
සාම්ප්‍රදායික යුනික්ස් විධාන සඳහා, මූලික නිත්‍ය ප්‍රකාශන සහ දීර් extended නිත්‍ය ප්‍රකාශන ඇත. විස්තර . sed මූලික නිත්‍ය ප්‍රකාශන භාවිතා කරයි, එබැවින් කණ්ඩායම් සින්ටැක්ස් සඳහා බැක්ස්ලෑෂ් අවශ්‍ය වේ. පර්ල් සහ පයිතන් නිත්‍ය ප්‍රකාශන පවා ඉක්මවා ගියහ. මම වටපිට බලමින් සිටියදී, “නිත්‍ය ප්‍රකාශනය” යනුවෙන් අප විචිත්‍රවත් ලෙස පවසන විට අප විසින් අවුල් කරන ලද අවුල් සහගත ඇඟිලි ගැසීම් නිරූපණය කරන අතිශය තොරතුරු සහිත ප්‍රස්ථාරයක් මට හමු විය .
කයිල් ජෝන්ස්

1
තනි උපුටා දැක්වීම් තුළ භාවිතා කළ නොහැකි එකම අක්‍ෂරය තනි උපුටා දැක්වීමක් බව මම එකතු කරමි.
enzotib

0

මූලික නිත්‍ය ප්‍රකාශනයට (BRE) පමණක් සහය දක්වන POSIX ප්‍රමිතිය මත sed පදනම් වී ඇති බව සඳහන් කිරීම වටී යැයි මම සිතමි. Sed විධානයෙහි වෙනස් සංස්කරණ දෙකක් ඇත්ත වශයෙන්ම පවතී - BSD (Mac OS) සහ GNU (Linux distros) . සෑම අනුවාදයක්ම POSIX ප්‍රමිතියට සමාන හා අද්විතීය දිගු ක්‍රියාත්මක කරන අතර විවිධ වේදිකා හරහා sed හි ක්‍රියාකාරීත්වයට බලපෑම් කළ හැකිය. එහි ප්‍රති As ලයක් වශයෙන්, එක් පද්ධතියක අපේක්ෂිත පරිදි ක්‍රියාත්මක වන sed විධානයෙහි නිසි වාක්‍ය ඛණ්ඩය ඇත්ත වශයෙන්ම තවත් වෙනස් ප්‍රති results ලයකට පරිවර්තනය කළ හැකිය. පැන ගිය සහ විශේෂ අක්ෂර භාවිතය සම්බන්ධයෙන් අනපේක්ෂිත ලෙස හැසිරීමට මෙය හේතු විය හැක.

පොසික්ස් ප්‍රමිතියට මෙම දිගුවන් සෙඩ් හි ග්නූ අනුවාදය මත වඩාත් ප්‍රචලිත වන අතර බොහෝ විට අඩු තද ආකෘතිකරණයේ පහසුව සපයයි, විශේෂයෙන් බීඑස්ඩී අනුවාදයට සාපේක්ෂව. කෙසේ වෙතත්, GNU sed සමහර විශේෂ අක්ෂරවල ක්‍රියාකාරීත්වයට ඉඩ දී ඇති නමුත් ඒවා තවමත් ඇත්ත වශයෙන්ම POSIX- අනුකූල නොවේ. මීට අමතරව, GNU sed තුළ මූලික හා දීර් extended නිත්‍ය ප්‍රකාශනය (ERE) අතර ඇති එකම සැබෑ වෙනස වන්නේ පහත දැක්වෙන විශේෂ අක්ෂරවල හැසිරීමයි:

'?', '+', වරහන්, වරහන් ('{}'), සහ '|'

මෙය එසේ විය හැකි නමුත්, සමහර විශේෂ අක්ෂරවලට බීඑස්ඩී සෙඩ් සඳහා '|', '?', සහ '+' වැනි සීමිත හෝ සහායක් නොමැත, එය පොසික්ස් සින්ටැක්ස් ප්‍රමිතීන්ට වඩා සමීපව පිළිපදින බැවින්. එම චරිත ඇතුළත් කිරීම, ග්නූ සෙඩ්ගේ ස්වරූපයට සමාන ආකාරයකින්, බොහෝ විට සෙඩ් භාවිතා කරමින් ස්ක්‍රිප්ට් වල අතේ ගෙන යා හැකි සහ ක්‍රියාකාරීත්වයේ ගැටළු ඇති කරයි. POSIX BRE සින්ටැක්ස් සමහර ගැලවීමේ අනුක්‍රමයන් සඳහා අර්ථයක් නිර්වචනය නොකරයි, විශේෂයෙන්: \ |, +, \?, `, \ ', \ <,>, \ B, \ B, \ w, සහ \ ඩබ්ලිව්.

බීඑස්ඩී / මැක් ඕඑස් අනුවාදය ධාවනය කරන අයට, සමහර විශේෂ අක්ෂරවල හැසිරීම අනුකරණය කිරීම ටිකක් උපක්‍රමශීලී විය හැකි නමුත් බොහෝ අවස්ථාවන්හිදී එය කළ හැකිය. උදාහරණයක් ලෙස, + මේ හා සමාන පොසික්ස් අනුකූල ආකාරයකින් අනුකරණය කළ හැකිය: {1,} සහ \? like 0,1} පාලක අක්‍ෂර අනුපිළිවෙලට සාමාන්‍යයෙන් සහය නොදක්වයි. හැකි නම්, නිසැකවම GNU sed භාවිතා කිරීම පහසුය, නමුත් ඔබට වේදිකා දෙකෙහිම ක්‍රියාකාරීත්වය අවශ්‍ය නම්, අතේ ගෙන යා හැකි බව සහතික කිරීම සඳහා POSIX විශේෂාංග පමණක් භාවිතා කිරීමට මතක තබා ගන්න. ඔබ මැක් පරිශීලකයෙකු නම් සහ BSD sed වලට වඩා GNU sed වලින් ප්‍රයෝජන ගැනීමට කැමති නම්, ඔබට හෝම්බ rew ස්ථාපනය කිරීමට උත්සාහ කළ හැකිය, සහ GNU sed විධාන රේඛාව හරහා බාගත කරන්න: w brew install gnu-sed.

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

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.