Re: Need help with sed statement

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Patrick O'Callaghan wrote:
> On Tue, 2010-05-04 at 14:11 +0200, Roberto Ragusa wrote:
>> David Bartmess wrote:
>>
>>> I'm trying to express only the filename from a filepath, i.e., 
>>> whoopie.txt from /opt/dev/whoopie.txt.
>> I see you already have received solutions.
>> Here is a simpler one (no sed, no basename):
>>
>> COMPLETEPATH=aa/bb/cc/dd
>> ONLYFILENAME=${COMPLETEPATH##*/}
> 
> Simplicity is in the eye of the beholder. Personally I prefer basename
> (and it's cousin dirname) because I know them and don't have to remember
> the Shell syntax for substitutions.
> 
> How would you adapt your method to do the same as "basename $foo .txt"?
> I don't doubt it can be done, but I can't be bothered working it out.
> That's what simplicity means in my book.

The shell syntax is not as difficult as it looks.
The "#" operator removes a matching part at the beginning (and we are
matching "*/" so anything followed by a slash).
There are two variants: "#" and "##"; the first one tries to match
as few characters as possible; the second one as many as possible.

Same thing with "%" and "%%", but they remove the end of the string.

Some examples:

[rragusa@thinkpad ~]$ x=aa/bb/cc/dd/ee.txt
[rragusa@thinkpad ~]$ echo ${x##*/}            #remove last slash and everything before it
ee.txt
[rragusa@thinkpad ~]$ echo ${x#*/}             #remove first slash and everything before it
bb/cc/dd/ee.txt
[rragusa@thinkpad ~]$ echo ${x%/*}             #remove last slash and everything after it
aa/bb/cc/dd
[rragusa@thinkpad ~]$ echo ${x%%/*}            #remove first slash and everything after it
aa
[rragusa@thinkpad ~]$ echo ${x%.*}             #remove unknown suffix
aa/bb/cc/dd/ee
[rragusa@thinkpad ~]$ file=${x##*/}; nosuff=${file%.txt}; echo $nosuff
                                               #isolate filename and remove known suffix
ee
[rragusa@thinkpad ~]$

The last one achieves (in two steps) what you were asking me.

Simplicity is many things. The syntax is unfamiliar until you learn it,
then it becomes "simple". Your method is easier to learn, but not as robust.
For example, your "basename $foo .txt" will fail if $foo contains a space.
You need quotes around foo to avoid the problem.

[rragusa@thinkpad ~]$ foo="try this.txt"; basename $foo .txt
basename: extra operand `.txt'
Try `basename --help' for more information.
[rragusa@thinkpad ~]$ foo="try this.txt"; basename "$foo" .txt
try this

The shell syntax is immune to the issue because it is an internal
manipulation of a variable, not an external command involving passing
arguments.
That is one manifestation of simplicity, from my point of view. :-)


-- 
   Roberto Ragusa    mail at robertoragusa.it
-- 
users mailing list
users@xxxxxxxxxxxxxxxxxxxxxxx
To unsubscribe or change subscription options:
https://admin.fedoraproject.org/mailman/listinfo/users
Guidelines: http://fedoraproject.org/wiki/Mailing_list_guidelines
[Index of Archives]     [Older Fedora Users]     [Fedora Announce]     [Fedora Package Announce]     [EPEL Announce]     [Fedora Magazine]     [Fedora News]     [Fedora Summer Coding]     [Fedora Laptop]     [Fedora Cloud]     [Fedora Advisory Board]     [Fedora Education]     [Fedora Security]     [Fedora Scitech]     [Fedora Robotics]     [Fedora Maintainers]     [Fedora Infrastructure]     [Fedora Websites]     [Anaconda Devel]     [Fedora Devel Java]     [Fedora Legacy]     [Fedora Desktop]     [Fedora Fonts]     [ATA RAID]     [Fedora Marketing]     [Fedora Management Tools]     [Fedora Mentors]     [SSH]     [Fedora Package Review]     [Fedora R Devel]     [Fedora PHP Devel]     [Kickstart]     [Fedora Music]     [Fedora Packaging]     [Centos]     [Fedora SELinux]     [Fedora Legal]     [Fedora Kernel]     [Fedora OCaml]     [Coolkey]     [Virtualization Tools]     [ET Management Tools]     [Yum Users]     [Tux]     [Yosemite News]     [Gnome Users]     [KDE Users]     [Fedora Art]     [Fedora Docs]     [Asterisk PBX]     [Fedora Sparc]     [Fedora Universal Network Connector]     [Libvirt Users]     [Fedora ARM]

  Powered by Linux