如何从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超过sed
或cut
因为
- 这正是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/;$//'
更智能的方法将使用单个perl
或awk
语句,可以一次执行过滤和不同的转换。 比如像这样的东西:
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