首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在find命令中获取当前目录并在sed - one-liner中使用

在find命令中获取当前目录并在sed - one-liner中使用
EN

Stack Overflow用户
提问于 2019-07-16 00:09:00
回答 3查看 278关注 0票数 3

我使用它在子目录中查找具有特定名称的文件,然后编辑一些内容:

代码语言:javascript
复制
find prod -type f -name "file.txt" -exec sed -i '' -e "s,^varname.*$, varname = \"$value\"," {} +

如何获取当前目录的名称(不是执行脚本的目录,而是找到文件的目录)并将其插入到替换文本中?类似于:

代码语言:javascript
复制
find prod -type f -name "file.txt" -exec sed -i '' -e "s,^ varname.*$, varname = \"$value/$dirname\"," {} +

我希望把它当做一句笑话。我最近的一次尝试是这样的,但是替代方法不起作用,我觉得必须有一个更简单的语法:

代码语言:javascript
复制
find prod -type f -name "file.txt" -exec sh -c '
  for file do
    dirname=${file%/*}
  done' sed -i '' -e "s,^varname.*$, varname = \"$value/$dirname\"," {} +

示例:

代码语言:javascript
复制
value=bar

file.txt输入:

代码语言:javascript
复制
varname = “foo”

file.txt输出:

代码语言:javascript
复制
varname = “bar/directory_name”
EN

回答 3

Stack Overflow用户

发布于 2019-07-16 03:07:14

您可以使用GNU awk以相同的方式完成此操作:

您使用的sed命令可以替换为:

代码语言:javascript
复制
$ awk --inplace -v v="$value" '(FNR==1){d=FILENAME;sub("/[^/]*$","",d)}/^varname/{$0="varname = "v"/"d}1'

所以你的find应该是这样的:

代码语言:javascript
复制
$ find prod -type f -name "file.txt" -exec awk --inplace -v v="$value" '(FNR==1){d=FILENAME;sub("/[^/]*$","",d)}/^varname/{$0="varname = "v"/"d}1' {} \;
票数 1
EN

Stack Overflow用户

发布于 2019-07-16 17:22:52

这可能适用于您(GNU sed和并行):

代码语言:javascript
复制
find prod -type f -name "file.txt" | 
parallel -qa- --link sed -i 's#\(varname=\).*#\1"{2}{1//}"#' {1} ::: $value

我们为并行命令提供了两个源代码。第一个源是使用并行选项-a -find命令的文件列表。第二个源是变量$value,它只是一个使用并行选项--link链接到第一个源的值。sed命令使用parallel选项-q引用,除了值{2}{1//}首先由parallel解释以分别表示第二个源和第一个源的目录之外,其他规则都适用于常规正则表达式。

注意:要检查并行命令是否符合您的要求,请使用--dryrun选项,并在实际运行之前检查输出。

票数 1
EN

Stack Overflow用户

发布于 2019-07-16 16:31:37

您需要使用-execdir并生成一个外壳:

代码语言:javascript
复制
find ... -execdir \
  bash -c 'sed -i "" -e "s,^ varname.*$, varname = \"$value/${PWD}\"," "$1"' -- {} +

-execdir在文件的父文件夹中运行sed,而不是在从中运行find的文件夹中运行。这允许使用$PWD

进一步注意:我使用两个参数调用bash:

代码语言:javascript
复制
-exec bash -c '... code ...' -- {}
                             ^^ ^^

我将--作为占位符传递。当使用-c调用时,bash开始在$0而不是$1处索引参数。($0通常包含脚本的名称)。这允许使用$1作为来自{}的文件名,这是我更容易阅读和理解的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57043551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档