如何使用awk在两个连续行的字符串之间插入文本
Posted
技术标签:
【中文标题】如何使用awk在两个连续行的字符串之间插入文本【英文标题】:how to insert text between strings on two successive lines with awk 【发布时间】:2022-01-16 04:39:09 【问题描述】:我有一个 yaml 文件,其中缺少一些行(示例下的源和目标:),其中下面的 word1 需要修复,但 word2 没问题。
- dyu: word1
alt:
trans:
- lang: fr
detail: null
speech:
- type: null
def:
- gloss: gloss1
note: null
example:
- dyu: word2
alt:
trans:
- lang: fr
detail: null
speech:
- type: null
def:
- gloss: gloss2
note: null
example:
- source: some example source
target: some example target
- dyu: word3
我已使用以下内容插入缺失的文本:
awk -i inplace -v data=" - source:\n target:" '/example:/ f=1 /- dyu:/ && f print data; f=01' $file
但问题是即使文本存在,它也会插入文本。我需要在example:\n - dyu
之间添加缺少的文本完全,而不是在target: something\n -dyu.
之间添加
期望的输出:
- dyu: word1
alt:
trans:
- lang: fr
detail: null
speech:
- type: null
def:
- gloss: gloss1
note: null
example:
- source:
target:
- dyu: word2
alt:
trans:
- lang: fr
detail: null
speech:
- type: null
def:
- gloss: gloss2
note: null
example:
- source: some example source
target: some example target
- dyu: word3
我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:这可能是您正在寻找的:
awk -v data=' - source:\n target:' \
'f if (/- dyu:/) print data; f=0 /example:/ f=1 1
END if (f) print data ' file
【讨论】:
【参考方案2】:$ cat tst.awk
example != ""
if ( !/- source:/ )
sub(/[^[:space:]].*/,"",example)
print example " - source:"
print example " target:"
example = ""
$1=="example:"
example = $0
print
$ awk -f tst.awk file
- dyu: word1
alt:
trans:
- lang: fr
detail: null
speech:
- type: null
def:
- gloss: gloss1
note: null
example:
- source:
target:
- dyu: word2
alt:
trans:
- lang: fr
detail: null
speech:
- type: null
def:
- gloss: gloss2
note: null
example:
- source: some example source
target: some example target
- dyu: word3
如果您愿意,请将正则表达式 !/- source:/
更改为 /- dyu:/
,脚本将与您的示例输入行为相同,但恕我直言,这不如仅测试 source
在 example
之后是否存在。
【讨论】:
以上是关于如何使用awk在两个连续行的字符串之间插入文本的主要内容,如果未能解决你的问题,请参考以下文章