COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2`
输出类似这样的东西
"Abc Inc";
我想要做的是我想删除尾随的“;”同样。我怎样才能做到这一点?我是bash的初学者。任何想法或建议都会有所帮助。
答案 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 -1
或head -c-1
。
COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | head --bytes -1`
head
仅输出流或文件的开头。通常它会对行进行计数,但可以对字符/字节进行计数。 head --bytes 10
将输出前十个字符,但head --bytes -10
将输出除最后十个字符以外的所有字符。
注意:如果最后一个字符是多字节但是分号不是
,则可能会出现问题我推荐这个解决方案超过sed
或cut
,因为
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/;$//'
更智能的方法是使用单个perl
或awk
语句,它可以同时进行过滤和不同的转换。例如:
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