[英]Using awk in a bash-script
我一直在努力运行 awk 结果作为 bash 脚本中新 awk 命令的 arguments ; 像这样的东西
echo $(
ag '^@' ~/dotfiles/shared/journal |
sed 's/\(^.*\.txt:\)\(.*\)/\2 \| \1/g' |
fzf |
awk -F\| 'BEGIN{OFS="";} { print "\"/", substr($1, 3, length($1)-3), "/,/^~+$/","\" ", substr($2, 1, length($2)-1) }'
) | xargs -0 -I "{}" awk {}
为了帮助消除(我认为是)对这个问题无关紧要的代码,
echo $(
ag '^@' ~/dotfiles/shared/journal |
sed 's/\(^.*\.txt:\)\(.*\)/\2 \| \1/g' |
fzf --height=40% --layout=reverse --info=inline --border --margin=1 |
awk -F\| 'BEGIN{OFS="";} { print "\"/", substr($1, 3, length($1)-3), "/,/^~+$/","\" ", substr($2, 1, length($2)-1) }'
)
给我
"/@ Search Pattern/,/^~+$/" /home/sam/dotfiles/shared/journal/20210125.txt
如果在这个结果前面加上 awk,我会得到我需要的答案。 但我无法使其与 xargs 一起使用; 它没有给出 output ... 另外,如果我删除 xargs pipe,并用awk
代替echo
,我得到
awk: cmd. line:1: "/@
awk: cmd. line:1: ^ unterminated string
如果我像这样更改相关引号
awk -F\| 'BEGIN{OFS="";} { print "\047/", substr($1, 3, length($1)-3), "/,/^~+$/","\047 ", substr($2, 1, length($2)-1) }'
我最终遇到了这个错误
awk: cmd. line:1: '/@
awk: cmd. line:1: ^ invalid char ''' in expression
甚至可以使用另一个 awk 命令的结果创建 awk 命令吗?
编辑:有更多解释这是我正在尝试做的全面图片...我的~/dotfiles/shared/journal
文件夹中有一堆文本文件,格式如下
@ Project Title
# Heading 1
some random text here, you know, typical markdown stuff
# Another Heading
Something **bold** here, etc., basically a typical markdown file
~~~
@ Another Project Title
# Second Project's Heading
Some more markdown
~~~
所以 ag 脚本会遍历所有文件,并列出所有项目标题(以@
为前缀很方便)
sed 线使其非常适合通过管道传输到 fzf,平均条目看起来像这样
2:@ Project Title | /home/sam/dotfiles/shared/journal/20210125.txt:
awk 线基本上会采用 output 并重新格式化它,以便它可以成为一个参数,(看起来像这样)
'/@ Project Title/,/^~+$/' /home/sam/dotfiles/shared/journal/20210125.txt
所以现在,如果我只取这个结果并在我的命令行上用 awk 作为前缀,就像这样
awk '/@ Project Title/,/^~+$/' /home/sam/dotfiles/shared/journal/20210125.txt
我会得到
@ Project Title
# Heading 1
some random text here, you know, typical markdown stuff
# Another Heading
Something **bold** here, etc., basically a typical markdown file
~~~
但是如果我用 awk 替换echo
,我会得到上面提到的错误。
编辑结束
**旁注**我最终想将pipe markdown放入weasyprint,但一次一件事......
您的报价并不会真正按照您想要的方式通过xargs
进行。 这不是不可能的,但我会做类似的事情
ag '^@' ~/dotfiles/shared/journal |
sed 's/\(^.*\.ejrnl:\)\(.*\)/\2 \| \1/g' |
fzf |
awk -F\| 'BEGIN{OFS="";} { print "/", substr($1, 3, length($1)-3), "/,/^~+$/","\" ", substr($2, 1, length($2)-1) }'
| sh
但是,如果您的文件中有多个相同的标题,这仍然可能是 go 错误。 一种更强大且更简单的方法是在您提取标题时提取开始和结束行号,然后在您想要提取整个日记条目时简单地传递它们。 类似的东西(未经测试)
awk '/^@/ { if(prev) print pf ":" prev "," FNR-1 ":" ptitle;
prev=FNR; pf=FILENAME; ptitle=$0; }
END { if (prev) print pf ":" prev "," FNR ":" ptitle }' ~/dotfiles/shared/journal/**/*.md |
fzf --height=40% --layout=reverse --info=inline --border --margin=1 |
while IFS=: read -r file lines _; do
sed -n "$lines"p "$file"
done
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.