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

liv*_*hak 51 bash grep

COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2` 
Run Code Online (Sandbox Code Playgroud)

输出这样的东西

"Abc Inc";
Run Code Online (Sandbox Code Playgroud)

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

zta*_*013 60

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

echo "$COMPANY_NAME" | rev | cut -c 2- | rev
Run Code Online (Sandbox Code Playgroud)


Lau*_*ves 49

我用了sed 's/;$//'.例如:

COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | sed 's/;$//'`
Run Code Online (Sandbox Code Playgroud)

  • 不要滥用`猫`.`grep`实际上可以读取文件,你知道吗?;-) (7认同)
  • @ Anony-Mousse是的,我知道至少有两种方法可以避免"猫"在这里.我离开了猫,以避免更改命令行超出实际需要的命令行使其工作. (6认同)
  • @ Anony-Mousse并非在所有情况下,只是grep没有cat -v会隐藏不可见的(例如恶意的)字符,http://unix.stackexchange.com/questions/202198/bash-why-does-x0d-x20-erase -The线 (2认同)

gro*_*ter 42

foo="hello world"
echo ${foo%?}
hello worl
Run Code Online (Sandbox Code Playgroud)

  • 这是bash方式,而不是其他管道装置. (4认同)
  • 我喜欢。添加额外的?删除更多字符。 (2认同)
  • 这让我大吃一惊,因为我正试图制作一个快速而肮脏的网站列表,列出我们拥有 TLS 密钥的网站。`for L in \`ls *key\` ; 做 echo ${L%.key} ; 完成` (2认同)

Aar*_*ang 23

我会用head --bytes -1,或head -c-1简称.

COMPANY_NAME=`cat file.txt | grep "company_name" | cut -d '=' -f 2 | head --bytes -1`
Run Code Online (Sandbox Code Playgroud)

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

注意:如果最终字符是多字节,则可能会出现问题,但不是分号

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

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

  • 我已经测试了其他建议的解决方案,这对我的用例来说似乎是最好的(也是一个简单的!).谢谢! (2认同)
  • 在 OSX `brew install coreutils` 上,您可以使用 `ghead -c-1` (2认同)

mig*_*ile 11

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

echo ${COMPANY_NAME:: -1}
Run Code Online (Sandbox Code Playgroud)

但我无法将grep文件嵌入花括号中,因此您的特定任务变为双线:

COMPANY_NAME=$(grep "company_name" file.txt); COMPANY_NAME=${COMPANY_NAME:: -1} 
Run Code Online (Sandbox Code Playgroud)

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

echo ${COMPANY_NAME/;/}
Run Code Online (Sandbox Code Playgroud)

要在结尾处仅删除分号:

echo ${COMPANY_NAME%;}
Run Code Online (Sandbox Code Playgroud)

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

echo ${COMPANY_NAME%%;}
Run Code Online (Sandbox Code Playgroud)

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


Det*_*Det 8

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

$ grep company_name file.txt | cut -d '=' -f2 | sed 's/.$//'
"Abc Inc"
Run Code Online (Sandbox Code Playgroud)

  • 我不认为你需要`\ {1 \}`因为`.`表示单个字符. (2认同)

Ano*_*sse 5

不要滥用cats.您知道grep吗也可以读取文件吗?

规范的方法是这样的:

grep "company_name" file.txt | cut -d '=' -f 2 | sed -e 's/;$//'
Run Code Online (Sandbox Code Playgroud)

更聪明的方法将使用单个perlawk语句,它可以一次过滤和不同的转换.例如这样的事情:

COMPANY_NAME=$( perl -ne '/company_name=(.*);/ && print $1' file.txt )
Run Code Online (Sandbox Code Playgroud)