SED - 使用其他行的某些内容生成行

SED - 使用其他行的某些内容生成行

我的文件夹中有一些文件

每个文件都有这样的结构:

...
product: Nike New Awesome Shoe
price: 123
color: black
...

我需要完成以下场景使用单个 SED 命令,在所有使用 *.txt 的文件中

基本上,我需要在以该模式开头的行中获取模式后的第一个单词,并在新行中与“brand:”连接。

选择以 (product: ) 开头的行 获取 (product: ) 之后的第一个单词 创建一个新行,将 Brand: 与其他行中的第一个单词连接起来

PS:我没有行号,因为行号可能会更改文件。

...
product: Nike New Awesome Shoe
brand: Nike
price: 123
color: black
...

答案1

使用sed,您可以复制匹配项并保留所需的字符串

$ sed '/^product/{p;s/[^ ]* \([^ ]*\).*/brand: \1/;}' input_file
...
product: Nike New Awesome Shoe
brand: Nike
price: 123
color: black
...

答案2

你可以使用这个:

sed 's/^product: \([^ ]*\) .*/&\
brand: \1/' file.txt

^product:匹配以以下开头的行产品:

\([^ ]*\)引用后面的词product:

&插入整个匹配项(在本例中为整行),反斜杠后跟换行符添加换行符,换行符以 开头,brand:后跟第一个引用的\1单词。

答案3

假设您的数据是 YAML 文件:

$ cat file 
product: Nike New Awesome Shoe
price: 123
color: black
$ yq -y '.brand = (.product|split(" ")[0])' file
product: Nike New Awesome Shoe
price: 123
color: black
brand: Nike

yq是来自python-yq 自制macOS 或 Linux 上的软件包,也可从https://kislyuk.github.io/yq/

该表达式获取product字符串并将其按空格分割。结果单词中的第一个被分配给 key brand

如果你使用 Mike Farah 的yq,你会这样做

$ yq '.brand = (.product|split(" ")|.[0])' file
product: Nike New Awesome Shoe
price: 123
color: black
brand: Nike

答案4

我会用awk

awk '/^product:/{print $0; print "price:",$2; next;}1' file

相关内容