如何在替换模式中将'sed'匹配推送到shell调用?
我需要用一些依赖于URL本身的内容替换文本文件中的几个URL。为了简单起见,假设它是URL处文档的第一行 我想说的是:如何在替换模式中将'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
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/”
outputaxs
。这个答案是正确的。(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
之前,并且首先只生成了一个随机数。的可能重复。虽然此问题比建议的重复更早,但该重复