我有一行是从文件中 grep 出来的,我试图仅提取引号内的值。
$db_name = "blah";
我正在使用这个管道来解析它:
| awk '{print $NF}' | tr -d \'\" | sed -r 's/.$//'
然而,这似乎会导致以下结果:
blah;
然而,我希望sed
咒语能够删除最后一个字符。我也尝试过使用sed -r
and sed -e
,这似乎没有任何效果。
由于我只需要在每种情况下删除;
,因此我尝试了sed 's/;//'
,它有效,但我仍然想知道为什么正则表达式不起作用。
有任何想法吗?
答案1
珀尔:
| awk '{print $NF}' | tr -d \'\" | perl -lpe 'chop'
乐:
| awk '{print $NF}' | tr -d \'\" | raku -pe '.=chop'
输入示例:
echo '$db_name = "blah";'
示例输出(两个代码示例):
blah
https://perldoc.perl.org/functions/chop
https://docs.raku.org/routine/chop
答案2
如果您使用awk ... | grep ... | sed ...
(或任何其他组合),您就犯了严重错误。
如果您使用 awk,则所有操作都在 awk 中执行,如果您使用 sed,则所有操作都在 sed 中执行。它们都可以做 grep 所做的事情。
话虽如此: sed 保留了最后一个字符,因为您没有告诉它删除它。按照以下方式进行(注意,这里我们只剪掉最后的带引号的字符串。如果有几个类似的foo "bar1" bar "bar2"
只会打印“bar2”):
your_input | sed 's/.*"\([^"]*\)".*/\1/'
或者
sed 's/.*"\([^"]*\)".*/\1/' /path/to/inputfile
答案3
FWIW,
- 如果您正在使用
bash
, 和 - 唯一的引号是最后一个词周围的引号,然后
您可以捕获每一行输出grep
并使用 shell 的文本操作函数,例如,
# take advantage of the default behaviour of read
while read; do
# remove everything upto and including the first "
lastPart=${REPLY#*\"}
# remove the second " and everything after it
wantedPart=${lastPart%\"*}
echo $wantedPart
done <<<$(grep somePattern someFile)
这是一个比其他任何事情都更有趣的练习,它不一定是健壮的,并且您的数据必须可靠地定期才能发挥作用。我完全理解 awk 的使用入门......