简体   繁体   中英

How to delete leading newline in a string in bash?

I'm having the following issue. I have an array of numbers:

text="\n1\t2\t3\t4\t5\n6\t7\t8\t9\t0"

And I'd like to delete the leading newline. I've tried

sed 's/.//' <<< "$text"
cut -c 1- <<< "$text"

and some iterations. But the issue is that both of those delete the first character AFTER EVERY newline. Resulting in this:

text="\n\t2\t3\t4\t5\n\t7\t8\t9\t0"

This is not what I want and there doesn't seem to be an answer to this case.

Is there a way to tell either of those commands to treat newlines like characters and the entire string as one entity?

awk to the rescue!

awk 'NR>1'

of course you can do the same with tail -n +2 or sed 1d as well.

You can probably use the substitution modifier (see parameter expansion and ANSI C quoting in the Bash manual):

$ text=$'\n1\t2\t3\t4\t5\n6\t7\t8\t9\t0'
$ echo "$text"

1   2   3   4   5
6   7   8   9   0
$ echo "${text/$'\n'/}"
1   2   3   4   5
6   7   8   9   0
$ 

It replaces the first newline with nothing, as requested. However, note that it is not anchored to the first character:

$ alt="${text/$'\n'/}"
$ echo "${alt/$'\n'/}"
1   2   3   4   56  7   8   9   0
$

Using a caret ^ before the newline doesn't help — it just means there's no match.

As pointed out by rici in the comments , if you read the manual page I referenced, you can find how to anchor the pattern at the start with a # prefix:

$ echo "${text/#$'\n'/}"
1   2   3   4   5
6   7   8   9   0
$ echo "${alt/#$'\n'/}"
1   2   3   4   5
6   7   8   9   0
$

The notation bears no obvious resemblance to other regex systems; you just have to know it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM