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

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

输出这样的东西

 "Abc Inc"; 

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

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

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

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

 echo "$COMPANY_NAME" | rev | cut -c 2- | rev 
 foo="hello world" echo ${foo%?} hello worl 

我会用head --bytes -1 ,或者head -c-1

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

head只输出stream或文件的开始。 通常情况下,它会对行进行计数,但也可以将字符数/字节数计数。 head --bytes 10将输出前10个字符,但是head --bytes -10将输出除最后十个之外的所有内容。

注意:如果最后一个字符是多字节,而分号不是,则可能有问题

我build议这个解决scheme超过sedcut因为

  • 这正是devise要做的事情,因此减less了命令行选项和更易于阅读的命令
  • 它节省了你不得不考虑正则expression式,这是很酷/function强大,但往往矫枉过正
  • 它节省了你的机器不得不考虑正则expression式,所以会不知不觉中更快

我相信用bash从一个string中去掉单个字符的最简洁的方法是:

 echo ${COMPANY_NAME:: -1} 

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

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

这将剥离任何字符,分号或不分号,但也可以具体去掉分号。 要删除所有分号,无论它们在哪里可能会掉落:

 echo ${COMPANY_NAME/;/} 

最后只删除一个分号:

 echo ${COMPANY_NAME%;} 

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

 echo ${COMPANY_NAME%%;} 

有关此方法的详细信息和更多信息,请参阅http://tldp.org/LDP/abs/html/string-manipulation.html上的Linux文档项目;

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

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

不要滥用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 ) 

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

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

在Bash中只使用一个外部工具:

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

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

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

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

 SRC_IP_MSG=${SRC_IP_MSG%??} 
 cat file.txt | grep "company_name" | cut -d '=' -f 2 | cut -d ';' -f 1 

我没有find该sed 's/;$//'作品。 它并没有削减任何东西,但是我想知道是不是因为我想修剪的angular色恰好是“$”。 什么对我来说是sed 's/.\{1\}$//'

你可以使用这个bash构造去掉一个string的开始和结尾,由N个字符组成,正如有人所说的那样

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

然而,这是不支持旧版本的bash ..正如我刚刚发现一个红帽子EL6安装过程的脚本。 这是张贴在这里的唯一原因。 一个黑客的方式来实现这一点是使用扩展正则expression式像这样sed:

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