Date: Thu, 28 Oct 2010 10:24:19 -0700 From: Devin Teske <dteske@vicor.com> To: Chad Perrin <perrin@apotheon.com> Cc: FreeBSD Questions <freebsd-questions@freebsd.org> Subject: Re: [OT] writing filters in sh Message-ID: <1288286659.20243.18.camel@localhost.localdomain> In-Reply-To: <20101027212841.GA67716@guilt.hydra> References: <20101027212841.GA67716@guilt.hydra>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 2010-10-27 at 15:28 -0600, Chad Perrin wrote: > I know that in sh you can get the contents out of files specified as > command line arguments: > > while read data; do > echo $data > done <$@ > > I know you can also get the contents of files from pipes and redirects: > > while read data; do > echo $data > done > > In Perl, you can use a single construct to do both and, unlike the first > sh example, it can also take multiple filenames as arguments and > effectively concatenate their contents: > > while (<>) { > print $_; > } > > I'm not exactly an *expert* in sh, in part because when things start > getting "interesting" while I'm writing shell scripts I tend to just use > a more robust language like Perl. Please let me know if there's some way > to use a simple idiom like the Perl example to get the same results in > sh. > see here: http://druidbsd.sf.net/download/sysrc.txt For example (NOTE: this is just an example -- the function itself is inefficient when one considers instead `tail -r file' and `tail -r < file' and `cat file | tail -r', though the function serves as a good example of how to achieve what you want): # ... | lrev # lrev $file ... # # Reverse lines of input. Unlike rev(1) which reverses the ordering of # characters on a single line, this function instead reverses the line # sequencing. # # For example, the following input: # # Line 1 # Line 2 # Line 3 # # Becomes reversed in the following manner: # # Line 3 # Line 2 # Line 1 # lrev() { local stdin_rev= if [ $# -gt 0 ]; then # # Reverse lines from files passed as positional arguments. # while [ $# -gt 0 ]; do local file="$1" [ -f "$file" ] && lrev < "$file" shift 1 done else # # Reverse lines from standard input # while read -r LINE; do stdin_rev="$LINE $stdin_rev" done fi echo -n "$stdin_rev" } -- Cheers, Devin Teske -> CONTACT INFORMATION <- Business Solutions Consultant II FIS - fisglobal.com 510-735-5650 Mobile 510-621-2038 Office 510-621-2020 Office Fax 909-477-4578 Home/Fax devin.teske@fisglobal.com -> LEGAL DISCLAIMER <- This message contains confidential and proprietary information of the sender, and is intended only for the person(s) to whom it is addressed. Any use, distribution, copying or disclosure by any other person is strictly prohibited. If you have received this message in error, please notify the e-mail sender immediately, and delete the original message without making a copy. -> END TRANSMISSION <-
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1288286659.20243.18.camel>