通过 stdin 的 sed 未按预期工作

通过 stdin 的 sed 未按预期工作

我有一行是从文件中 grep 出来的,我试图仅提取引号内的值。

$db_name                = "blah";

我正在使用这个管道来解析它:

| awk '{print $NF}' | tr -d \'\" | sed  -r 's/.$//'

然而,这似乎会导致以下结果:

blah;

然而,我希望sed咒语能够删除最后一个字符。我也尝试过使用sed -rand 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,

  1. 如果您正在使用bash, 和
  2. 唯一的引号是最后一个词周围的引号,然后

您可以捕获每一行输出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 的使用入门......

相关内容