如何从bash grep输出中删除最后一个字符

时间:2011-02-22 06:38:48

标签: bash grep

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

输出类似这样的东西

"Abc Inc";

我想要做的是我想删除尾随的“;”同样。我怎样才能做到这一点?我是bash的初学者。任何想法或建议都会有所帮助。

14 个答案:

答案 0 :(得分:57)

这将删除您的COMPANY_NAME var中包含的最后一个字符,无论它是否是分号:

echo "$COMPANY_NAME" | rev | cut -c 2- | rev

答案 1 :(得分:45)

我使用sed 's/;$//'。例如:

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

答案 2 :(得分:40)

foo="hello world"
echo ${foo%?}
hello worl

答案 3 :(得分:20)

我会使用head --bytes -1head -c-1

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

head仅输出流或文件的开头。通常它会对行进行计数,但可以对字符/字节进行计数。 head --bytes 10将输出前十个字符,但head --bytes -10将输出除最后十个字符以外的所有字符。

注意:如果最后一个字符是多字节但是分号不是

,则可能会出现问题

我推荐这个解决方案超过sedcut,因为

  • 这正是head的设计目标,因此命令行选项更少,命令更易于阅读
  • 它可以让你不必考虑正则表达式,这些正则表达式很酷/很强大,但往往有点过分
  • 它可以让您的机器不必考虑正则表达式,因此会在不知不觉中加快速度

答案 4 :(得分:10)

我相信用bash从字符串中删除单个字符的最简洁方法是:

echo ${COMPANY_NAME:: -1}

但是我还没有能够将grep片段嵌入花括号中,所以你的特定任务变成了双线:

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

这会删除任何字符,分号或不分号,但也可以专门删除分号。 删除所有分号,无论它们落在何处:

echo ${COMPANY_NAME/;/}

最后只删除分号:

echo ${COMPANY_NAME%;}

或者,从末尾删除多个分号:

echo ${COMPANY_NAME%%;}

有关此方法的详细信息和更多内容,Linux文档项目涵盖了http://tldp.org/LDP/abs/html/string-manipulation.html

的大量内容。

答案 5 :(得分:7)

使用sed,如果您不知道最后一个字符是什么:

$ grep company_name file.txt | cut -d '=' -f2 | sed 's/.$//'
"Abc Inc"

答案 6 :(得分:5)

不要滥用cat。您是否知道grep也可以读取文件?

规范的方法是:

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

更智能的方法是使用单个perlawk语句,它可以同时进行过滤和不同的转换。例如:

COMPANY_NAME=$( perl -ne '/company_name=(.*);/ && print $1' file.txt )

答案 7 :(得分:3)

不必链接这么多工具。只有一个awk命令完成这项工作

 COMPANY_NAME=$(awk -F"=" '/company_name/{gsub(/;$/,"",$2) ;print $2}' file.txt)

答案 8 :(得分:1)

在Bash中只使用一个外部实用程序:

IFS='= ' read -r discard COMPANY_NAME <<< $(grep "company_name" file.txt)
COMPANY_NAME=${COMPANY_NAME/%?}

答案 9 :(得分:1)

假设引号实际上是输出的一部分,你不能只使用-o开关来返回引号之间的所有内容吗?

COMPANY_NAME="\"ABC Inc\";" | echo $COMPANY_NAME | grep -o "\"*.*\""

答案 10 :(得分:1)

上面回答的一些改进。要删除多个字符,请添加多个问号。例如,要从变量$ SRC_IP_MSG中删除最后两个字符,您可以使用:

SRC_IP_MSG=${SRC_IP_MSG%??}

答案 11 :(得分:0)

cat file.txt | grep "company_name" | cut -d '=' -f 2 | cut -d ';' -f 1

答案 12 :(得分:0)

我发现sed 's/;$//'无效。它没有修剪任何东西,但我想知道是否因为我试图修剪的角色碰巧是“$”。对我有用的是sed 's/.\{1\}$//'

答案 13 :(得分:0)

你可以使用这个bash结构删除N个字符的字符串的开头和结尾,就像有人说的那样

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

然而,在旧版本的bash中不支持这个...因为我刚刚发现为Red Hat EL6安装过程编写脚本。这是发布在这里的唯一原因。 实现这一目标的一种hacky方法是使用带有扩展正则表达式的sed:

$ fred=abcdefg.rpm
$ echo $fred | sed -re 's/^.(.*)....$/\1/g'
bcdefg