我需要找到newUrd并将entryUUID替换为newrdn,然后将该行移动到另一行下。该文本文件将具有超过500k的更改类型,因此无法移动到特定的行号。
文本文件中的原始行:
dn: [email protected],ou=people,dc=example,dc=com
changetype: modrdn
deleteoldrdn: 1
newsuperior: ou=people,dc=example,dc=com
entryUUID: 6277b4d4e3-xxxx-xxxx-xxxx-xxxxxxxxxx
我想用newrdn替换entryUUID,然后将此行移到以changetype开头的行之下。
理想输出:
dn: [email protected],ou=people,dc=example,dc=com
changetype: modrdn
newrdn: 6277b4d4e3-xxxx-xxxx-xxxx-xxxxxxxxxx
deleteoldrdn: 1
newsuperior: ou=people,dc=example,dc=com
我正在使用以下命令;但是,它无法按预期工作(添加新的错误条目而不是移动行)
sed -i '/^changetype:*/a;'s/entryUUID:/newrdn:/g' file.txt
使用sed
的一种方法:
具有多个条目的示例文件:
dn: [email protected],ou=people,dc=example,dc=com
changetype: modrdn
deleteoldrdn: 1
newsuperior: ou=people,dc=example,dc=com
entryUUID: 6277b4d4e3-xxxx-xxxx-xxxx-xxxxxxxxxx
---
dn: [email protected],ou=people,dc=example,dc=com
changetype: modrdn
deleteoldrdn: 1
newsuperior: ou=people,dc=example,dc=org
entryUUID: 7277b4d4e3-xxxx-xxxx-xxxx-xxxxxxxxxx
sed -e '/^deleteoldrdn:/{N;h;d}; /^entryUUID:/{s/^entryUUID:/newrdn:/;p;g}' input.txt
dn: [email protected],ou=people,dc=example,dc=com
changetype: modrdn
newrdn: 6277b4d4e3-xxxx-xxxx-xxxx-xxxxxxxxxx
deleteoldrdn: 1
newsuperior: ou=people,dc=example,dc=com
---
dn: [email protected],ou=people,dc=example,dc=com
changetype: modrdn
newrdn: 7277b4d4e3-xxxx-xxxx-xxxx-xxxxxxxxxx
deleteoldrdn: 1
newsuperior: ou=people,dc=example,dc=org
/^deleteoldrnd:/{N;h;d}
每次读取以deleteoldrnd:
开头的行,还要读取下一行并将其添加到当前的pattern space(N
),用该模式替换当前的hold space空格(h
),删除图案空间并以新行(d
)重新开始。
/^entryUUID:/ {s/^entryUUID:/newrdn:/;p;g}
每次读取以entryUUID:
开头的行,将前缀更改为newrdn:
,打印图案空间(p
),然后用保留空间(g
)替换图案空间,是原始文件中紧接的deleteoldrdn
和newsuperior
行。然后,新的模式空间将自动打印出来。
如果您使用的是GNU sed(自您标记此[linux]以来似乎很有可能),则变化为:
sed -e '/^deleteoldrdn:/{N;h;z;N;s/\nentryUUID:/newrdn:/;p;g}' input.txt
使用GNU扩展名z
擦除模式空间,然后再以相同的命令序列读取UUID行,而不是将其分成两部分。