簡體   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