我的文件夹中有一些文件
每个文件都有这样的结构:
...
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