Sed
sed 命令用空白替換模式,包括換行模式
我有一個包含文本的 yaml 文件:
- name: flexvol-driver-host hostPath: type: DirectoryOrCreate path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec imagePullSecrets: - name: acrrepo-bad25ec678be80
我有一個 shell 腳本,我只想通過它來刪除
- name:.*
。**imagePullSecrets:
所以如果imagePullSecrets:
**在- name:
它下面,那麼它應該被刪除並且只imagePullSecrets:
應該被保留。請有人可以幫助我用 sed 做到這一點。
PS: yaml doc中可以有多個條目**
imagePullSecrets:
。所以一切都imagePullSecrets:
**應該以與上述相同的方式處理。
如果指定的行一個接一個,GNU sed 可以這樣做:
sed 'N;/\s*imagePullSecrets:\n[ -]*name:/!{P;D};s/\n.*//' file
編輯器緩衝區(模式空間)中總是有兩行。如果它們與模式不匹配,則列印第一行,
P
然後由命令刪除,D
並將執行轉移到腳本的最開頭,即下一行由N
命令添加到剩餘的第二行,然後再次在循環檢查與模式的匹配。如果找到該模式,則{P;D}
跳過命令,中斷循環並執行替換命令s///
,它會切斷緩衝區中的第二行。在下一步中,編輯器開始工作,將下一行載入到空緩衝區中,如果不是最後一行,則通過N
命令添加另一行。如果在執行時N
命令,事實證明最後一行已經載入到緩衝區中,然後終止腳本的進一步執行並列印緩衝區中存在的一行。必須承認,
sed
FreeBSD 的行為不同並且不顯示最後的奇數行。
D
…刪除模式空間中的文本直到第一個換行符,並使用生成的模式空間重新啟動循環,而不讀取新的輸入行。