使用sed在另一行下移动特定行

问题描述 投票:0回答:1

我需要找到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
linux select sed line move
1个回答
0
投票

使用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 spaceN),用该模式替换当前的hold space空格(h),删除图案空间并以新行(d)重新开始。

/^entryUUID:/ {s/^entryUUID:/newrdn:/;p;g}

每次读取以entryUUID:开头的行,将前缀更改为newrdn:,打印图案空间(p),然后用保留空间(g)替换图案空间,是原始文件中紧接的deleteoldrdnnewsuperior行。然后,新的模式空间将自动打印出来。

如果您使用的是GNU sed(自您标记此[linux]以来似乎很有可能),则变化为:

sed -e '/^deleteoldrdn:/{N;h;z;N;s/\nentryUUID:/newrdn:/;p;g}' input.txt 

使用GNU扩展名z擦除模式空间,然后再以相同的命令序列读取UUID行,而不是将其分成两部分。

© www.soinside.com 2019 - 2024. All rights reserved.