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