如何在替换模式中将'sed'匹配推送到shell调用?

如何在替换模式中将'sed'匹配推送到shell调用?,sed,Sed,我需要用一些依赖于URL本身的内容替换文本文件中的几个URL。为了简单起见,假设它是URL处文档的第一行 我想说的是: sed "s/^URL=\(.*\)/TITLE=$(curl -s \1 | head -n 1)/" file.txt 这不起作用,因为未设置\1。然而,shell正在被调用。我是否可以将sedmatch变量推送到该子流程?因此您试图从sed替换的替换模式内部调用外部命令。我认为这是办不到的,因为。。。在模式内部,只允许使用已经存在的(常量)shell变量 我将使用Per

我需要用一些依赖于URL本身的内容替换文本文件中的几个URL。为了简单起见,假设它是URL处文档的第一行

我想说的是:

sed "s/^URL=\(.*\)/TITLE=$(curl -s \1 | head -n 1)/" file.txt

这不起作用,因为未设置
\1
。然而,shell正在被调用。我是否可以将
sed
match变量推送到该子流程?

因此您试图从sed替换的替换模式内部调用外部命令。我认为这是办不到的,因为。。。在模式内部,只允许使用已经存在的(常量)shell变量

我将使用Perl,请参见操作符(s/../…/e)中的/e选项

更新:我错了,sed很好地处理了shell,它允许您这样做。但是,
\1
中的反冲应该被消除。请尝试:

sed "s/^URL=\(.*\)/TITLE=$(curl -s \\1 | head -n 1)/" file.txt

因此,您试图从sed替换的替换模式内部调用外部命令。我认为这是办不到的,因为。。。在模式内部,只允许使用已经存在的(常量)shell变量

我将使用Perl,请参见操作符(s/../…/e)中的/e选项

更新:我错了,sed很好地处理了shell,它允许您这样做。但是,
\1
中的反冲应该被消除。请尝试:

sed "s/^URL=\(.*\)/TITLE=$(curl -s \\1 | head -n 1)/" file.txt
试试这个:

sed "s/^URL=\(.*\)/\1/" file.txt | while read url; do sed "s@URL=\($url\)@TITLE=$(curl -s $url | head -n 1)@" file.txt; done
如果原始文件中有重复的URL,则输出中将有n^2个URL。@作为分隔符取决于不包含该字符的URL。

尝试以下操作:

sed "s/^URL=\(.*\)/\1/" file.txt | while read url; do sed "s@URL=\($url\)@TITLE=$(curl -s $url | head -n 1)@" file.txt; done

如果原始文件中有重复的URL,则输出中将有n^2个URL。@作为分隔符取决于不包含该字符的URL。

接受答案完全错误。证明:

制作一个可执行脚本
foo.sh

#! /bin/bash

echo $* 1>&2
现在运行它:

$ echo foo | sed -e "s/\\(foo\\)/$(./foo.sh \\1)/"
\1
$ 

在运行sed之前,
$(…)
被展开。accept答案完全错误。证明:

制作一个可执行脚本
foo.sh

#! /bin/bash

echo $* 1>&2
现在运行它:

$ echo foo | sed -e "s/\\(foo\\)/$(./foo.sh \\1)/"
\1
$ 

在运行sed之前,
$(…)
会展开

延迟回复,但要确保人们不会被这里的答案吓跑——这可以在gnused中使用
e
命令完成。例如,以下命令将行开头的数字递减:

echo "444 foo" | sed "s/\([0-9]*\)\(.*\)/expr \1 - 1 | tr -d '\n'; echo \"\2\";/e"
将产生:

443 foo

延迟回复,但确保人们不会被这里的答案吓跑——这可以在gnu-sed中使用
e
命令完成。例如,以下命令将行开头的数字递减:

echo "444 foo" | sed "s/\([0-9]*\)\(.*\)/expr \1 - 1 | tr -d '\n'; echo \"\2\";/e"
将产生:

443 foo

它可以工作,在替换模式中使用$(日期)试试。哈,sed比我想象的更强大。然后,尝试使用\\1I来避免反弹,我希望在调用sed之前,先计算
$(…)
表达式;所以curl会尝试下载URL“
\1
”。你的其他一些反斜杠肯定被吃掉了,因为你使用了双引号。哦,不,这正是我在一个多小时内搜索的内容,只有2006年的旧sed v4.1.5似乎不支持这一点:((同时尝试了$()语法和反斜杠)```谢谢,我搜索了一个小时,这正是我想要的。它有效,用$(日期)在替换模式中。哈,sed的功能比我想象的要强大。然后,尝试使用\\1I来避免这种反弹,我希望在调用sed之前首先计算
$(…)
表达式;因此curl会尝试下载URL“
\1
”。你的其他一些反斜杠肯定被吃掉了,因为你使用了双引号。哦,不,这正是我一个多小时以来一直在搜索的内容,只有2006年的旧sed v4.1.5似乎不支持这一点:((尝试了$()语法和反斜杠``)谢谢,我搜索了一个小时,这正是我想要的。这个,不像公认的答案,似乎应该有效。好吧,除了双引号内的反斜杠。这个,不像公认的答案,似乎应该有效。好吧,除了双引号内的反斜杠。你的反斜杠太多了,上尉urnign组为空。echo foo | sed“s/\(foo\)/$(./foo.sh\\1)/“脚本的参数仍然是
\1
,而不是
foo
。在这种情况下,反斜杠的数量不会改变任何内容:
echo afoos | sed-e“s/\(foo\)/x/”
echo afoos | sed-e“s/\(foo\)/x/”
output
axs
。这个答案是正确的。
(echo“a”)| sed“s/a/$(echo$RANDOM)/g“
——这可能是一个更容易理解的示例,它将
a
的每个实例替换为一个随机数(使用
$RANDOM
),但所有替换都是相同的数字,因为
$(…)
shell扩展发生在执行
sed
之前,首先只生成一个随机数。您的反斜杠太多,CapturSign组为空..echo foo | sed“s/\(foo\)/$(./foo.sh\\1)/“脚本的参数仍然是
\1
而不是
foo
。在这种情况下,反斜杠的数量没有任何变化:都是
echo-afoos | sed-e“s/\(foo\)/x/”
echo-afoos | sed-e“s/\(foo\)/x/”
输出
axs
。这个答案是正确的。<124code>(echo“a a a”);sed”s/a/$(echo$RANDOM)/g“——这可能是一个更容易理解的示例,它将
a
的每个实例替换为随机数(使用
$RANDOM
),但所有替换都是相同的数字,因为
$(…)
shell扩展发生在执行
sed
之前,并且首先只生成了一个随机数。的可能重复。虽然此问题比建议的重复更早,但该重复