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

后端 未结 3 344
面向向阳花
面向向阳花 2021-02-04 07:15

Example:

    before: text_before_specific_character(specific_character)text_to_be_deleted
    after: text_before_specific_character

I know that

3条回答
  •  孤街浪徒
    2021-02-04 07:46

    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 

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

提交回复
热议问题