කිසියම් නිමැවුමක එක් එක් පේළියෙන් ප්‍රමුඛ හා පසුපස සුදු අවකාශය කපා ගන්නේ කෙසේද?


193

නිමැවුමක සෑම පේළියකින්ම ප්‍රමුඛ හා පසුපස ඇති අවකාශ සහ ටැබ් ඉවත් කිරීමට මම කැමතියි.

trimමගේ ප්‍රතිදානය තුළට නළා දැමිය හැකි සරල මෙවලමක් තිබේද?

උදාහරණ ගොනුව:

test space at back 
 test space at front
TAB at end  
    TAB at front
sequence of some    space in the middle
some empty lines with differing TABS and spaces:





 test space at both ends 

4
නව රේඛා ඉවත් කිරීම සඳහා විසඳුමක් සොයන ඕනෑම කෙනෙකුට එය වෙනස් ගැටලුවකි. අර්ථ දැක්වීම අනුව නව රේඛාවක් නව පෙළක් නිර්මාණය කරයි. එබැවින් පෙළ පේළියක නව රේඛාවක් අඩංගු විය නොහැක. ඔබට ඇසීමට අවශ්‍ය ප්‍රශ්නය නම් නූලක ආරම්භයේ හෝ අවසානයේ සිට නව රේඛාවක් ඉවත් කරන්නේ කෙසේද : stackoverflow.com/questions/369758 , හෝ හිස් අවකාශයක් ඇති හිස් රේඛා හෝ රේඛා ඉවත් කරන්නේ කෙසේද: serverfault.com/questions/252921
ටෝනි

Answers:


246
awk '{$1=$1;print}'

හෝ කෙටි:

awk '{$1=$1};1'

නායක හා අවර අවකාශය හෝ ටැබ් චරිත සිඳීම ඇත 1 තනි අභ්යවකාශයට ටැබ් සහ හිස් තැන් අනුපිළිවෙලවල්, මිරිකා හැරීම.

එය ක්‍රියාත්මක වන්නේ ඔබ එක් ක්ෂේත්‍රයකට යමක් awkපැවරූ විට , printසියලු ක්ෂේත්‍ර ( $1, ..., $NF) සමඟ OFS(පෙරනිමියෙන් අවකාශය ) එක් කිරීමෙන් සම්පූර්ණ වාර්තාවම (මුද්‍රණය කළ පරිදි ) නැවත ගොඩනඟයි .

1 (සහ පෙදෙසි සහ awkක්‍රියාත්මක කිරීම මත පදනම්ව වෙනත් හිස් අක්ෂර )


2
දෙවන උදාහරණයේ ඇති අර්ධ සළකුණ අතිරික්තය. භාවිතා කළ හැකිය:awk '{$1=$1}1'
බ්‍රයන්


සිත්ගන්නාසුළුයි ... කිසිදු අර්ධ සළකුණක් උකුස්සන්, මවුක් සහ ඕඑස් එක්ස් හි අවදියෙන් සහය නොදක්වයි. (අවම වශයෙන් මගේ අනුවාද සඳහා (පිළිවෙලින් 1.2, 4.1.1 සහ 20070501)
බ්‍රයන්

4
මෙම ප්‍රවේශය ගැන මා අකමැති එකම දෙය නම් ඔබට රේඛාව තුළ පුනරාවර්තන අවකාශයන් අහිමි වීමයි. උදාහරණයක් ලෙස,echo -e 'foo \t bar' | awk '{$1=$1};1'
user.friendly

2
echo ' hello ' | xargs
JREAM

57

ඔබ GNU භාවිතා කරන්නේ නම් විධානය cond නීභවනය කළ හැකිය sed:

$ sed 's/^[ \t]*//;s/[ \t]*$//' < file

උදාහරණයක්

මෙන්න ඉහත විධානය ක්‍රියාත්මක වේ.

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
blahblah

විධානය මඟින් අපේක්ෂිත අක්ෂර නිවැරදිව ඉවත් කරන hexdumpබව තහවුරු කිරීමට ඔබට භාවිතා කළ හැකිය sed.

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//' | hexdump -C
00000000  62 6c 61 68 62 6c 61 68  0a                       |blahblah.|
00000009

චරිත පන්ති

මේ වගේ කට්ටල වචනාර්ථයෙන් ලැයිස්තුගත කිරීම වෙනුවට ඔබට අක්ෂර පන්ති නම් භාවිතා කළ හැකිය [ \t]:

$ sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' < file

උදාහරණයක්

$ echo -e " \t   blahblah  \t  " | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'

නිත්‍ය ප්‍රකාශන (රීජෙක්ස්) භාවිතා කරන බොහෝ GNU මෙවලම් මෙම පන්ති සඳහා සහාය වේ.

 [[:alnum:]]  - [A-Za-z0-9]     Alphanumeric characters
 [[:alpha:]]  - [A-Za-z]        Alphabetic characters
 [[:blank:]]  - [ \x09]         Space or tab characters only
 [[:cntrl:]]  - [\x00-\x19\x7F] Control characters
 [[:digit:]]  - [0-9]           Numeric characters
 [[:graph:]]  - [!-~]           Printable and visible characters
 [[:lower:]]  - [a-z]           Lower-case alphabetic characters
 [[:print:]]  - [ -~]           Printable (non-Control) characters
 [[:punct:]]  - [!-/:-@[-`{-~]  Punctuation characters
 [[:space:]]  - [ \t\v\f]       All whitespace chars
 [[:upper:]]  - [A-Z]           Upper-case alphabetic characters
 [[:xdigit:]] - [0-9a-fA-F]     Hexadecimal digit characters

වචනානුසාරයෙන් කට්ටල වෙනුවට මේවා භාවිතා කිරීම සැමවිටම අවකාශය නාස්තියක් සේ පෙනේ, නමුත් ඔබේ කේතය අතේ ගෙන යා හැකි වීම ගැන හෝ විකල්ප අක්ෂර කට්ටල සමඟ ගනුදෙනු කිරීමට සිදුවුවහොත් (ජාත්‍යන්තර යැයි සිතන්න), එවිට ඔබට පන්ති නම් භාවිතා කිරීමට අවශ්‍ය වනු ඇත වෙනුවට.

යොමුව


සාමාන්‍ය නඩුවට [[:space:]]සමාන නොවන බව සලකන්න [ \t](යුනිකෝඩ්, ආදිය). [[:space:]]බොහෝ විට මන්දගාමී වනු ඇත (යුනිකෝඩ් හි තවත් බොහෝ සුදු අවකාශයන් හුදෙක් ' 'සහ වඩා '\t'). අනෙක් සියල්ලන්ටම එකම දෙය.
ඔලිවියර් ඩුලැක්

1
sed 's/^[ \t]*//'අතේ ගෙන යා නොහැක. ඇත්ත වශයෙන්ම POSIX හට අවකාශය, බැක්ස්ලෑෂ් හෝ tඅක්ෂර අනුක්‍රමයක් ඉවත් කිරීම අවශ්‍ය වන අතර පරිසරයේ sedසිටින විට GNU ද කරන්නේ POSIXLY_CORRECTඑයයි.
ස්ටෙෆාන් චසෙලාස්

මට නව රේඛා අක්ෂර කැපීමට අවශ්‍ය නම් කුමක් කළ යුතුද? 'text n \ n පෙළ \ n \ n'
ඉයුජින් බිරියුකොව්

අවිනිශ්චිත ද්‍රාවණයේ දී මෙන් වෙනත් අතුරු ආබාධ නොමැති වීම නිසා මම සෙඩ් ද්‍රාවණයට කැමතියි. මම දැන් OSX jsut හි බාෂ් ලෙස උත්සාහ කළ විට පළමු විචලනය ක්‍රියා නොකරයි, නමුත් අක්ෂර පන්ති අනුවාදය ක්‍රියා කරයි:sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'
ටෝනි

Post ඉයුජින්බිරියුකොව් මුල් සටහන පිළිබඳ මගේ අදහස බලන්න
ටෝනි

29

තර්ක නොමැතිව xargs එය කරයි.

උදාහරණයක්:

trimmed_string=$(echo "no_trimmed_string" | xargs) 

2
මෙය රේඛාවක් තුළ බහුවිධ අවකාශයන් සංකෝචනය කරයි, එය ප්‍රශ්නයේ දී ඉල්ලා
නොසිටියේය

1
aroaima - සත්‍ය නමුත් පිළිගත් පිළිතුර ද අවකාශයන් මිරිකා ගනී (එය ප්‍රශ්නයේ දී ඉල්ලා නොසිටි). මම හිතන්නේ මෙහි ඇති සැබෑ ගැටළුව xargsනම් ආදානයේ බැක්ස්ලෑෂ් සහ තනි උපුටා දැක්වීම් තිබේ නම් එය ලබා දීමට අපොහොසත් වනු ඇත.
don_crissti

@don_crissti යන්නෙන් අදහස් නොකෙරේ, පිළිගත් පිළිතුර, ඇසූ පරිදි ප්‍රශ්නයට නිවැරදිව පිළිතුරු සපයයි. නමුත් මෙහිදී මෙහි එය අවවාදයක් ලෙස සලකුණු නොකළ අතර පිළිගත් පිළිතුරෙහි එය විය. අනාගත පා er කයෙකුට එය අදාළ වන්නේ නම් මම කාරණය ඉස්මතු කර පෙන්වමි.
රෝයිමා

එය තනි උපුටා දැක්වීම්, ද්විත්ව උපුටා දැක්වීම්, බැක්ස්ලෑෂ් අක්ෂර ද බිඳ දමයි. එය echoආයාචනා එකක් හෝ කිහිපයක් ක්‍රියාත්මක කරයි. සමහර ප්‍රතිරාවය ක්‍රියාත්මක කිරීම් මඟින් විකල්ප සහ / හෝ බැක්ස්ලෑෂ් ද සැකසෙනු ඇත ... එය ද ක්‍රියාත්මක වන්නේ තනි පේළි ආදානය සඳහා පමණි.
ස්ටෙෆාන් චසෙලාස්

25

පිළිගත් පිළිතුරෙන් ස්ටෙෆාන් චසෙලාස් යෝජනා කළ පරිදි , ඔබට දැන්
පිටපතක් සෑදිය හැකිය /usr/local/bin/trim:

#!/bin/bash
awk '{$1=$1};1'

එම ගොනුවට ක්‍රියාත්මක කළ හැකි අයිතිවාසිකම් ලබා දෙන්න:

chmod +x /usr/local/bin/trim

දැන් ඔබට සෑම ප්‍රතිදානයක්ම trimඋදාහරණයක් ලෙස සම්මත කළ හැකිය :

cat file | trim

(පහත දැක්වෙන අදහස් සඳහා: මම මීට පෙර මෙය භාවිතා කළෙමි: while read i; do echo "$i"; done
එය ද හොඳින් ක්‍රියා කරයි, නමුත් ක්‍රියාකාරීත්වය අඩුය)


1
ඔබගේ ගොනුව විශාල නම් සහ / හෝ බැක්ස්ලෑෂ් අඩංගු නම් වාසනාව.
don_crissti

1
@don_crissti: ඔබට තව ටිකක් අදහස් දැක්විය හැකිද ?, විශාල ලිපිගොනු සඳහා වඩාත් සුදුසු විසඳුම කුමක්ද? ගොනුවේ බැක්ස්ලෑෂ් තිබේ නම් මගේ විසඳුම වෙනස් කරන්නේ කෙසේද?
rubo77

4
ඔබ භාවිතා කිරීමට සිදුවේවි while read -r linebackslashes ආරක්ෂා කිරීමට හා ඒ සඳහා පවා ... . විශාල ලිපිගොනු / වේගය සම්බන්ධයෙන්, ඇත්ත වශයෙන්ම, ඔබ තෝරාගත්තේ නරකම විසඳුමයි. මම හිතන්නේ නැහැ ඊට වඩා නරක දෙයක් තියෙනවා කියලා. මත පිළිතුරු බලන්න ඇයි ක්රියාවලිය පෙළ නරක පුරුදු කිරීමට ෂෙල් ලූප භාවිතා කරන බවත්; වේග මිණුම් දණ්ඩකට සබැඳියක් එක් කළ අවසාන පිළිතුර පිළිබඳ මගේ අදහස ද ඇතුළුව. මෙහි ඇති sedපිළිතුරු ඉතා හොඳ IMO සහ වඩා හොඳය read.
don_crissti

@don_crissti ... සහ / හෝ -ඊ, ඊ හෝ එන් අක්ෂර 1 ක් හෝ ඊට වැඩි සංයෝජනයකින් ආරම්භ වන සහ පසුව රේඛා ඇති අතර / හෝ NUL අක්ෂර අඩංගු වේ. එසේම, අවසාන නව රේඛාවෙන් පසුව අවසන් නොකරන ලද රේඛාවක් මඟ හරිනු ඇත.
ස්ටෙෆාන් චසෙලාස්

2
ඔබ ද / etc / පැතිකඩ අන්වර්ථ එකතු කල හැක (හෝ ඔබේ ~ / .bashrc හෝ ~ / .zshrc ආදිය ...) හෙවත් සිඳීම = "awk '{\ $ 1 = \ $ 1}; 1'"
ජෙෆ් ක්ලේටන්

19
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'

ඔබ ෂෙල් විචල්‍යයකට රේඛාවක් කියවන්නේ නම්, වෙනත් ආකාරයකින් උපදෙස් නොදුන්නේ නම්read දැනටමත් එය කරයි .


1
සඳහා +1 read. එබැවින් ඔබ කියවන අතරතුර නල මාර්ගයක් cat file | while read i; do echo $i; done
යෙදුවහොත්

1
ඔබේ උදාහරණයේ දී නම් නොකල විචල්‍යය ද කවචයෙන් නැවත සකසනු ලැබේ. echo "$i"read
රොයිමා

17

ඔබ රේඛා විචල්යයන් ලෙස ගබඩා කරන්නේ නම්, ඔබට කාර්යය කිරීමට bash භාවිතා කළ හැකිය:

ප්‍රමුඛ සුදු අවකාශය නූලකින් ඉවත් කරන්න:

shopt -s extglob
echo ${text##+([[:space:]])}

නූලකින් පසුපස අවකාශය ඉවත් කරන්න:

shopt -s extglob
echo ${text%%+([[:space:]])}

සියලු හිස් අවකාශය නූලකින් ඉවත් කරන්න:

echo ${text//[[:space:]]}

1
සියළුම සුදු අවකාශය නූලකින් ඉවත් කිරීම ප්‍රමුඛ හා පසුපස අවකාශයන් ඉවත් කිරීමට සමාන නොවේ (ප්‍රශ්නයේ දී මෙන්).
catpnosis

හොඳම විසඳුම - එයට අවශ්‍ය වන්නේ බාෂ් බිල්ඩින් පමණක් වන අතර බාහිර ක්‍රියාවලි දෙබලක නැත.
පීටර් - මොනිකා

2
හොඳයි. පිටත වැඩසටහන් (අවදි හෝ සෙඩ් වැනි) ඇද ගැනීමට අවශ්‍ය නැතිනම් ස්ක්‍රිප්ට් වේගයෙන් ධාවනය වේ. මෙය ksh හි "නවීන" (93u +) අනුවාද සමඟද ක්‍රියා කරයි.
user1683793

16

'පයිප්ප' මෙවලමකට ස්තූතිවන්ත වන පරිදි දී ඇති රේඛාවකින් ප්‍රමුඛ හා පසුපස ඇති සියලුම අවකාශයන් ඉවත් කිරීමට, මට සම්පූර්ණයෙන්ම සමාන නොවන විවිධ ක්‍රම 3 ක් හඳුනාගත හැකිය. මෙම වෙනස්කම් ආදාන රේඛාවේ වචන අතර ඇති අවකාශයන් ගැන සැලකිලිමත් වේ. අපේක්ෂිත හැසිරීම මත පදනම්ව, ඔබ ඔබේ තේරීම කරනු ඇත.

උදාහරණ

වෙනස්කම් පැහැදිලි කිරීම සඳහා, මෙම ව්‍යාජ ආදාන රේඛාව සලකා බලමු:

"   \t  A   \tB\tC   \t  "

tr

$ echo -e "   \t  A   \tB\tC   \t  " | tr -d "[:blank:]"
ABC

trඇත්තෙන්ම සරල විධානයකි. මෙම අවස්ථාවේ දී, එය ඕනෑම අවකාශයක් හෝ වගු අක්ෂරයක් මකා දමයි.

awk

$ echo -e "   \t  A   \tB\tC   \t  " | awk '{$1=$1};1'
A B C

awk ප්‍රමුඛ හා වලිග අවකාශයන් මකා දමා වචන අතර සෑම අවකාශයක්ම තනි අවකාශයකට මිරිකා ගනී.

sed

$ echo -e "   \t  A   \tB\tC   \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
A       B   C

මේ අවස්ථාවේ දී, sedවචන අතර කවර හෝ ඉඩක් ස්පර්ශ තොරව හිස් තැන් ප්රමුඛ හා බඩගාති දමයි.

සටහන:

එක් පේළියකට එක් වචනයක් සම්බන්ධයෙන්, trකාර්යය කරයි.


1
මේ කිසිවක් පසුපසින් / ප්‍රමුඛ පෙළේ නවකතා අඩු නොකරයි
බෙන් සින්ක්ලෙයාර්

ඔවුන්ගේ (සමහර විට අනපේක්ෂිත) ප්‍රතිදානය සහිත විසඳුම් ලැයිස්තුවක් සඳහා +1.
ටෝනි

6 user61382 මෙය තරමක් ප්‍රමාදයි, නමුත් මුල් සටහන පිළිබඳ මගේ අදහස බලන්න.
ටෝනි

ighhighmaintenance: [:space:][: blank:] වෙනුවට, විධානය සඳහා tr, වැනි :, නව රේඛා ... | tr -d [:space:]ඉවත් කිරීමට භාවිතා කරන්න. (බලන්න: man tr)
tron5

6

sed ඒ සඳහා හොඳ මෙවලමක්:

                        # substitute ("s/")
sed 's/^[[:blank:]]*//; # parts of lines that start ("^")  with a space/tab 
     s/[[:blank:]]*$//' # or end ("$") with a space/tab
                        # with nothing (/)

ඔබේ නඩුව සඳහා පෙළ භාවිතා කිරීම සඳහා ඔබට එය භාවිතා කළ හැකිය, උදා

<file sed -e 's/^[[...

හෝ ඔබ sedGNU එකක් නම් එය 'පේළියේ' ක්‍රියාත්මක කිරීමෙන්:

sed -i 's/...' file

නමුත් ප්‍රභවය මේ ආකාරයෙන් වෙනස් කිරීම "භයානක" බැවින් එය නිවැරදිව ක්‍රියා නොකරන විට (හෝ එය සිදු වූ විට පවා) සොයාගත නොහැකි විය හැක, එබැවින් පළමුව උපස්ථ කරන්න (නැතහොත් -i.bakසමහර බීඑස්ඩී වලට අතේ ගෙන යා හැකි ප්‍රතිලාභයක්ද භාවිතා කරන්න sed) !


4

ඔබට බැලූ බැල්මට තේරුම් ගත හැකි පිළිතුරක්:

#!/usr/bin/env python3
import sys
for line in sys.stdin: print(line.strip()) 

පාරිතෝෂිකය: str.strip([chars])කැපීමට හෝ භාවිතා කිරීමට .lstrip()හෝ .rstrip()අවශ්‍ය පරිදි අත්තනෝමතික අක්ෂර වෙනුවට ආදේශ කරන්න .

වැනි rubo77 පිළිතුර , තිර ලෙස සුරැකිය /usr/local/bin/trimහා සමග අවසර දෙන්න chmod +x.


2

පරිවර්තන විධානය ක්‍රියාත්මක වේ

cat file | tr -d [:blank:]

6
මෙම විධානය නිවැරදි නොවේ, එය ගොනුවේ ඇති සියලුම අවකාශයන් ඉවත් කරයි, සුදු අවකාශය ප්‍රමුඛ / පසුපස නොවේ.
බ්‍රයන් රෙඩ්බයර්ඩ්

RianBrianRedbeard ඔබ නිවැරදිය. මෙය තවමත් අවකාශයක් නොමැතිව මොනොලිතික් නූලකට ප්‍රයෝජනවත් පිළිතුරකි.
ඇන්තනි රට්ලෙජ්

1

යමෙකු කැපීමට උත්සාහ කරන නූල කෙටි හා අඛණ්ඩ / පරස්පර නම්, යමෙකුට එය ඕනෑම පරාමිතියකට පරාමිතියක් ලෙස සම්මත කළ හැකිය:

    trim(){
        echo $@
    }

    a="     some random string   "

    echo ">>`trim $a`<<"
Output
>>some random string<<

1

මම මේ ෂෙල් ශ්‍රිතය ලිව්වේ awk භාවිතා කරමිනි

awkcliptor(){
    awk -e 'BEGIN{ RS="^$" } {gsub(/^[\n\t ]*|[\n\t ]*$/,"");print ;exit}' "$1" ; } 

BEGIN{ RS="^$" }:
ආරම්භයට පෙර සෙට්
රෙකෝඩ් බෙදුම්කරු කිසිවෙකුට විග්‍රහ කිරීම, එනම් සම්පූර්ණ ආදානය
තනි වාර්තාවක් ලෙස සලකන්න

gsub(this,that):
මෙම රීජෙක්ස්ප් එක එම නූල සමඟ ආදේශ කරන්න

/^[\n\t ]*|[\n\t ]*$/:
ඕනෑම පෙර නව පේළියකට යොමු කිරීමේ අක්ෂරය අවකාශය හා ටැබ් පන්තිය string උඩ ක
හෝ පශ්චාත් නව පේළියකට යොමු කිරීමේ අක්ෂරය අවකාශය හා ටැබ් පන්තිය හා ඔවුන්ට වෙනුවට
හිස් අගයක්

print;exit: ඉන්පසු මුද්‍රණය කර පිටවන්න

"$1":
සහ ක්‍රියාවෙහි පළමු තර්කය
අවදි කිරීමෙන් සම්මත කරන්න

භාවිතා කරන්නේ කෙසේද:
ඉහත කේතය පිටපත් කරන්න, කවචයේ අලවන්න, ඉන්පසු
ශ්‍රිතය අර්ථ දැක්වීම සඳහා ඇතුළත් කරන්න .
එවිට ඔබට පළමු තර්කය ආදාන ගොනුව ලෙස විධානයක් ලෙස awkcliptor භාවිතා කළ හැකිය

නියැදි භාවිතය:

echo '
 ggggg    

      ' > a_file
awkcliptor a_file

ප්‍රතිදානය:

ggggg

හෝ

echo -e "\n ggggg    \n\n      "|awkcliptor 

ප්‍රතිදානය:

ggggg

කරුණාකර වෙනස සාධාරණ ලෙස පැහැදිලි කළ හැකිද awk '{$1=$1};1'?
rubo77

0
trimpy () {
    python3 -c 'import sys
for line in sys.stdin: print(line.strip())'
}
trimsed () {
gsed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
# example usage
echo " hi " | trimpy

පාරිතෝෂිකය: str.strip([chars])කැපීමට හෝ භාවිතා කිරීමට .lstrip()හෝ .rstrip()අවශ්‍ය පරිදි අත්තනෝමතික අක්ෂර වෙනුවට ආදේශ කරන්න .

(මෙය මෙහි ඇති වෙනත් පිළිතුරු නැවත කියවීමක් පමණි.)

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.