How to remove the last character from a bash grep output

后端 未结 14 1448
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-08 06:29
COMPANY_NAME=`cat file.txt | grep \"company_name\" | cut -d \'=\' -f 2` 

outputs something like this

\"Abc Inc\";

相关标签:
14条回答
  • 2020-12-08 06:39

    Don't abuse cats. Did you know that grep can read files, too?

    The canonical approach would be this:

    grep "company_name" file.txt | cut -d '=' -f 2 | sed -e 's/;$//'
    

    the smarter approach would use a single perl or awk statement, which can do filter and different transformations at once. For example something like this:

    COMPANY_NAME=$( perl -ne '/company_name=(.*);/ && print $1' file.txt )
    
    0 讨论(0)
  • 2020-12-08 06:41

    I believe the cleanest way to strip a single character from a string with bash is:

    echo ${COMPANY_NAME:: -1}
    

    but I haven't been able to embed the grep piece within the curly braces, so your particular task becomes a two-liner:

    COMPANY_NAME=$(grep "company_name" file.txt); COMPANY_NAME=${COMPANY_NAME:: -1} 
    

    This will strip any character, semicolon or not, but can get rid of the semicolon specifically, too. To remove ALL semicolons, wherever they may fall:

    echo ${COMPANY_NAME/;/}
    

    To remove only a semicolon at the end:

    echo ${COMPANY_NAME%;}
    

    Or, to remove multiple semicolons from the end:

    echo ${COMPANY_NAME%%;}
    

    For great detail and more on this approach, The Linux Documentation Project covers a lot of ground at http://tldp.org/LDP/abs/html/string-manipulation.html

    0 讨论(0)
  • 2020-12-08 06:45

    I'd use head --bytes -1, or head -c-1 for short.

    COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | head --bytes -1`
    

    head outputs only the beginning of a stream or file. Typically it counts lines, but it can be made to count characters/bytes instead. head --bytes 10 will output the first ten characters, but head --bytes -10 will output everything except the last ten.

    NB: you may have issues if the final character is multi-byte, but a semi-colon isn't

    I'd recommend this solution over sed or cut because

    • It's exactly what head was designed to do, thus less command-line options and an easier-to-read command
    • It saves you having to think about regular expressions, which are cool/powerful but often overkill
    • It saves your machine having to think about regular expressions, so will be imperceptibly faster
    0 讨论(0)
  • 2020-12-08 06:47

    you can strip the beginnings and ends of a string by N characters using this bash construct, as someone said already

    $ fred=abcdefg.rpm
    $ echo ${fred:1:-4}
    bcdefg
    

    HOWEVER, this is not supported in older versions of bash.. as I discovered just now writing a script for a Red hat EL6 install process. This is the sole reason for posting here. A hacky way to achieve this is to use sed with extended regex like this:

    $ fred=abcdefg.rpm
    $ echo $fred | sed -re 's/^.(.*)....$/\1/g'
    bcdefg
    
    0 讨论(0)
  • 2020-12-08 06:51

    I'd use sed 's/;$//'. eg:

    COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | sed 's/;$//'`
    
    0 讨论(0)
  • 2020-12-08 06:51
    foo="hello world"
    echo ${foo%?}
    hello worl
    
    0 讨论(0)
提交回复
热议问题