Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to delete everything in a string after a specific character?

Tags:

linux

bash

Example:

    before: text_before_specific_character(specific_character)text_to_be_deleted
    after: text_before_specific_character

I know that it can be done with 'sed'. But i'm stuck. Can someone help me out?

like image 250
knightOfSpring Avatar asked Jun 29 '12 16:06

knightOfSpring


People also ask

How do you delete everything after a character in C++?

We can use the substr() function to delete all characters after a specific character in a string.

How do I remove a string after a character in Excel?

Type the formula: =LEFT(A2,FIND(“@”,A2)-1). Press the return key. This will give you the text obtained after removing everything following the '@' symbol from the string in cell A2.


2 Answers

There's no reason to use an external tool such as sed for this; bash can do it internally, using parameter expansion:

If the character you want to trim after is :, for instance:

$ str=foo_bar:baz
$ echo "${str%%:*}"
foo_bar

You can do this in both greedy and non-greedy ways:

$ str=foo_bar:baz:qux
$ echo "${str%:*}"
foo_bar:baz
$ echo "${str%%:*}"
foo_bar

Especially if you're calling this inside a tight loop, starting a new sed process, writing into the process, reading its output, and waiting for it to exit (to reap its PID) can be substantial overhead that doing all your processing internal to bash won't have.


Now -- often, when wanting to do this, what you might really want is to split a variable into fields, which is better done with read.

For instance, let's say that you're reading a line from /etc/passwd:

line=root:x:0:0:root:/root:/bin/bash
IFS=: read -r name password_hashed uid gid fullname homedir shell _ <<<"$line"
echo "$name" # will emit "root"
echo "$shell" # will emit "/bin/bash"

Even if you want to process multiple lines from a file, this too can be done with bash alone and no external processes:

while read -r; do
  echo "${REPLY%%:*}"
done <file

...will emit everything up to the first : from each line of file, without requiring any external tools to be launched.

like image 63
Charles Duffy Avatar answered Oct 20 '22 22:10

Charles Duffy


What you're looking for is actually really easy:

sed 's/A.*//'

Where A marks the specific character. Note that it is case sensitive, if you want to catch multiple characters use

sed 's/[aAbB].*//'
like image 29
Etheryte Avatar answered Oct 20 '22 22:10

Etheryte