繁体   English   中英

在 bash 脚本中使用 awk

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM