当前位置: 首页 > 面试题库 >

在xargs变量上使用sed在shell扩展中不起作用

谭坚诚
2023-03-14
问题内容

我试图在Redis中使用批处理sed替换每个密钥名称的批处理密钥重命名。(内部似乎没有更好的方法来执行此操作)。

redis-cli -n 5 KEYS "*::staging::*"| xargs -I {} echo "RENAME {} $(echo {} | sed 's/staging/development/g')" 
# Then pipe this command into redis-cli when working

我期望这样的输出: "RENAME redis::staging::key redis::development::key"

相反,我只是得到这个: "RENAME redis::staging::key redis::staging::key"

echo {} $(echo {}| sed 's/old/new/')就是让我挂起来的…如何正确地获取xargs输出并回显该输出的原始版本和编辑版本?$(echo {} |sed)应该工作吧?(如果是这样,我该如何正确执行?)


问题答案:

单独使用sed的解决方案

sed本身能够产生未修改的行和已修改的行:

$ echo "redis::staging::key" | sed 's/^/RENAME /; p; s/staging/development/g'
RENAME redis::staging::key
RENAME redis::development::key

在上面,sed首先将RENAME字符串添加到该行的开头。然后,p命令告诉sed打印当时的行(“ staging”仍在其中)。下一个替换项放入“
development”,然后也打印该版本。

更新: 假设我们要在一行上输出:

$ echo "redis::staging::key" | sed 's/.*/RENAME & &/; s/staging/development/2'
RENAME redis::staging::key redis::development::key

s上面的第一个命令将RENAME添加到开头,然后将其加倍。第二个阶段用开发替换了第二个阶段的出现。

为什么xargs版本没有替换?

xargs -I {} echo "RENAME {} $(echo {} | sed 's/staging/development/g')"

在执行xargs之前,bash处理字符串。特别是,它看到$(echo {} | sed 's/staging/development/g')并执行它(“命令替换”)并获得结果{}。因此,当xargs最终运行时,它会看到以下命令:

xargs -I {} echo "RENAME {} {}"

因此,s/staging/development/g永远不会进行替换。

使xargs和shell以适当的顺序一起工作

有一个解决方法:

$ echo "redis::staging::key" | xargs -I {} sh -c 'echo RENAME {} $(echo {} | sed 's/staging/development/g')'
RENAME redis::staging::key redis::development::key

上面将bash命令放在单引号内,并将它们作为参数传递给sh。这样,直到xargs进行替换后,外壳程序才处理字符串。



 类似资料:
  • 我正在尝试慢慢地从Obj-C迁移到Swift。我的第一步是将小型、简单的方法迁移到Swift扩展,所以我决定尝试迁移但这并不起作用,因为它认为该方法是在我的Objective-C代码中的其他地方实现的。事实并非如此。 我使用的是Xcode 7.3(7D175) 以下是一些复制步骤: > 创建一个新的Obj-C项目。 创建一个新的空的Swift文件,名为。这也创建了一个桥接头文件。 添加到Bridi

  • 我正在尝试为一些我正在IntelliJ(2020.1.4)上编辑的JS文件设置调试器。我按照这里的说明使用JetBrains Chrome扩展程序进行调试,我认为我已经完成了所有步骤,如图所示: Chrome Extension上的正确设置与默认IntelliJ端口相同,扩展本身表示它已连接到IntelliJ IDEA 2020.1.4 但在我的chrome控制台上,我看到它越过了我的断点,因为它

  • 我试图在windows server 2012上的环境变量路径中添加PHP目录,单击高级系统参数- %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1。0\ ; c:\wamp64\bin\php\php7。2.10\

  • 我正在尝试构建一个自动填充扩展,但我不知道如何在我的js FIE中使用用户输入。我试着用: 这在html脚本中(弹出用于扩展)。并且在autofill js文件中我写到: 但如果我在chrome控制台中键入第一个命令并刷新页面,则full_name_E值将出现在框中。我试过导入/导出,但它不起作用。有人帮忙吗?

  • 问题内容: 我究竟做错了什么?为什么$ path在函数外部正确打印,但是在函数内部无法访问? 问题答案: 因为它没有在函数中定义。 有几种方法可以解决此问题: 1)使用亚历克斯所说的话,告诉函数它是一个全局变量: 2)将其定义为常量: 3)如果特定于该函数,则将其传递给该函数: 根据功能的实际工作原理,其中之一会起作用。

  • 扩展 发生在一行命令被分成一个个的 记号(tokens) 之后。换言之,扩展是一种执行数学运算的机制,还可以用来保存命令的执行结果,等等。 感兴趣的话可以阅读关于shell扩展的更多细节。 大括号扩展 大括号扩展让生成任意的字符串成为可能。它跟 文件名扩展 很类似,举个例子: echo beg{i,a,u}n # begin began begun 大括号扩展还可以用来创建一个可被循环迭代的区间。