Frank Schmitt
Frank Schmitt

Reputation: 30775

How can I provide the $INPUT_RECORD_SEPARATOR to ruby -n -e?

I'd like to use Ruby's $INPUT_RECORD_SEPARATOR aka $/ to operate on a tab-separated file.

The input file looks like this (grossly simplified):

a   b   c

(the values are separated by tabs).

I want to get the following output:

a---
b---
c---

I can easily achieve this by using ruby -e and setting the $INPUT_RECORD_SEPARATOR alias $/:

cat bla.txt | ruby -e '$/ = "\t"; ARGF.each {|line| puts line.chop + "---" }'

This works, but what I'd really like is this:

cat bla.txt | ruby -n -e '$/ = "\t"; puts $_.chop + "---" '

However, this prints:

a       b       c---

Apparently, it doesn't use the provided separator - presumably because it has already read the first line before the separator was set. I tried to provide it as an environment variable:

cat bla.txt | $/="\n" ruby -n -e 'puts $_.chop + "---" '

but this confuses the shell - it tries to interpret $/ as a command (I also tried escaping the $ with one, two, three or four backslashes, all to no avail).

So how can I combine $/ with ruby -n -e ?

Upvotes: 2

Views: 291

Answers (2)

Jordan Running
Jordan Running

Reputation: 106027

Use a BEGIN block, which is processed before Ruby begins looping over the lines:

$ echo "foo\tbar\tbaz" | \
>   ruby -n -e 'BEGIN { $/ = "\t" }; puts $_.chop + "---"'
foo---
bar---
baz---

Or, more readably:

#!/usr/bin/env ruby -n
BEGIN {
  $/ = "\t"
}

puts $_.chop + "---"

Then:

$ chmod u+x script.rb
$ echo "foo\tbar\tbaz" | ./script.rb
foo---
bar---
baz---

If this is more than a one-off script (i.e. other people might use it), it may be worthwhile to make it configurable with an argument or an environment variable, e.g. $/ = ENV['IFS'] || "\t".

Upvotes: 2

cozyconemotel
cozyconemotel

Reputation: 1161

Use the -0 option :

cat bla.txt | ruby -011 -n -e 'puts $_.chop + "---" '
a---
b---
c---

-0[ octal] Sets default record separator ($/) as an octal. Defaults to \0 if octal not specified.

tabs have an ascii code of 9, which in octal is 11. Hence the -011

Upvotes: 2

Related Questions