我試過了
sed -n '/- name: string/,/^$/p' dire1/main.yml >> dire2/README.md
這不會添加任何內容,如果 readme.md 尚未在第一行中包含 '- name: string' ,我還希望將其添加到 dire2/readme.md 的第一行,以免重復。
例如,如果一個檔案包含
- name: first step
uses: message
- name: second step
我想要
- name: first step
uses: message
包含在 readme.md 的第一行。但是如果 readme.md 的第一行已經有了這個,就不應該再添加了。
另一個例子 該檔案是一個較長的檔案
name: build
another line here
yet another line
- name: title here
another line
another line
- name: another title
more lines here
more lines
- name: third title
more lines
more lines
在這個例子中,我希望它填充 readme.md 檔案
- name: title here
another line
another line
或以“- name”開頭并以空行結尾的任何其他段落。
這一切都必須從一個檔案中搜索,如果尚不存在,則將其添加到自述檔案的開頭
感謝您的任何幫助
uj5u.com熱心網友回復:
我構建了一個快速的 awk 解決方案,適用于您的示例。首先,3個示例檔案:
kent$ head *.yml
==> main.yml <==
- name: first step
uses: message
- name: second step
==> readme1.yml <==
key:
whatever2: 200
==> readme2.yml <==
- name: exists
users: whatever
- key:
whatever2: 100
如您所見,main.ymlreadme1.yml中不包含第一個鍵 ( - name: xxx)。雖然readme2.yml已經包含密鑰。
現在awk命令:(兩個命令是一樣的,只是輸入引數不同):
$ awk -F':' -v RS="" 'NR==FNR{if(NR==1){k=$1;a[k]=$0;}next;} FNR==1 && !($1 in a){print a[k]}1' main.yml readme1.yml
- name: first step
uses: message
key:
whatever2: 200
$ awk -F':' -v RS="" 'NR==FNR{if(NR==1){k=$1;a[k]=$0;}next;} FNR==1 && !($1 in a){print a[k]}1' main.yml readme2.yml
- name: exists
users: whatever
- key:
whatever2: 100
所以,如果你檢查上面的輸出,它們似乎是你所期望的。
uj5u.com熱心網友回復:
使用 GNU sed,您可以提取塊并在第一個之后退出:
sed -n '/^- name.*$/,/^$/{p;/^$/q}' file
- name: title here
another line
another line
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368385.html
上一篇:bash中的迭代檔案名
