gpt4 book ai didi

regex - Shell 脚本 - 列出文件、读取文件并将数据写入新文件

转载 作者:行者123 更新时间:2023-12-05 01:09:24 25 4
gpt4 key购买 nike

我有一个关于 shell 脚本的特殊问题。
简单的脚本编写对我来说没有问题,但我是新手,想让我成为一个简单的数据库文件。

所以,我想做的是:

- Search for filetypes (i.e. .nfo) <-- should be no problem :)
- read inside of each found file and use some strings inside
- these string of each file should be written in a new file. Each found file informations

应该是新文件中的一行

我希望我能很好地解释我的“项目”。

我现在的问题是,要了解如何告诉脚本它必须搜索文件,然后使用每个文件读入其中并使用其中的一些信息将其写入新文件。

我会解释得更好一点。
我正在搜索文件,这让我回来了:

file1.nfo
file2.nfo
file3.nfo



好的,现在在每个文件中,我都需要两行之间的信息。 IE。
file1.nfo:
<user>test1</user>

file2.nfo:
<user>test2</user>

所以在新文件中现在应该有:
file1.nfo:user1
file2.nfo:user2

好的,所以:
find -name *.nfo  > /test/database.txt

正在打印文件列表。

sed -n '/<user*/,/<\/user>/p' file1.nfo

给我完整的文件,而不仅仅是 <user> 之间的信息和 </user>
我试着一步一步地继续,我读了很多书,但这似乎很难。

我做错了什么,列出所有文件并将文件和两个字符串之间的内容写入文件的最佳方法应该是什么?

编辑-新:

好的,这是有关更多信息的更新。
我现在学到了很多,并在网上搜索了我的问题。我可以找到很多信息,但我不知道如何将它们放在一起以便我可以使用它。

现在使用 awk 是我取回文件名和字符串。

现在这里是完整的信息(我以为我可以在一些帮助下自己继续,但我不能:()

这是一个示例:/test/file1.nfo
<string1>STRING 1</string1>
<string2>STRING 2</string2>
<string3>STRING 3</string3>
<string4>STRING 4</string4>
<personal informations>
<hobby>Baseball</hobby>
<hobby>Baskeball</hobby>
</personal informations>

这是/test/file2.nof 的示例
<string1>STRING 1</string1>
<string2>STRING 2</string2>
<string3>STRING 3</string3>
<string4>STRING 4</string4>
<personal informations>
<hobby>Soccer</hobby>
<hobby>Traveling</hobby>
</personal informations>

我要创建的文件必须看起来像这样。
STRING 1:::/test/file1.nfo:::Date of file:::STRING 4:::STRING 3:::Baseball, Basketball:::STRING 2
STRING 1:::/test/file2.nfo:::Date of file:::STRING 4:::STRING 3:::Baseball, Basketball:::STRING 2

“文件日期”应该是文件的创建日期。这样我就可以看到文件的年龄。

所以,这就是我所需要的,这似乎并不容易。

非常感谢。

更新错误 -printf
find: unrecognized: -printf

Usage: find [PATH]... [OPTIONS] [ACTIONS]

Search for files and perform actions on them.
First failed action stops processing of current file.
Defaults: PATH is current directory, action is '-print'

-follow Follow symlinks
-xdev Don't descend directories on other filesystems
-maxdepth N Descend at most N levels. -maxdepth 0 applies
actions to command line arguments only
-mindepth N Don't act on first N levels
-depth Act on directory *after* traversing it

Actions:
( ACTIONS ) Group actions for -o / -a
! ACT Invert ACT's success/failure
ACT1 [-a] ACT2 If ACT1 fails, stop, else do ACT2
ACT1 -o ACT2 If ACT1 succeeds, stop, else do ACT2
Note: -a has higher priority than -o
-name PATTERN Match file name (w/o directory name) to PATTERN
-iname PATTERN Case insensitive -name
-path PATTERN Match path to PATTERN
-ipath PATTERN Case insensitive -path
-regex PATTERN Match path to regex PATTERN
-type X File type is X (one of: f,d,l,b,c,...)
-perm MASK At least one mask bit (+MASK), all bits (-MASK),
or exactly MASK bits are set in file's mode
-mtime DAYS mtime is greater than (+N), less than (-N),
or exactly N days in the past
-mmin MINS mtime is greater than (+N), less than (-N),
or exactly N minutes in the past
-newer FILE mtime is more recent than FILE's
-inum N File has inode number N
-user NAME/ID File is owned by given user
-group NAME/ID File is owned by given group
-size N[bck] File size is N (c:bytes,k:kbytes,b:512 bytes(def.))
+/-N: file size is bigger/smaller than N
-links N Number of links is greater than (+N), less than (-N),
or exactly N
-prune If current file is directory, don't descend into it
If none of the following actions is specified, -print is assumed
-print Print file name
-print0 Print file name, NUL terminated
-exec CMD ARG ; Run CMD with all instances of {} replaced by
file name. Fails if CMD exits with nonzero
-delete Delete current file/directory. Turns on -depth option

最佳答案

pat1,pat2 sed 的符号是基于行的。这么想,pat1为其命令和 pat2 设置启用标志禁用标志。如果两者都pat1pat2在同一行上,将设置标志,因此在您的情况下,打印以下所有内容并包括 <user>线。见 grymoire's sed howto更多。

在这种情况下,sed 的替代方法是使用支持环视断言的 grep,例如GNU grep:

find . -type f -name '*.nfo' | xargs grep -oP '(?<=<user>).*(?=</user>)'

如果 grep 不支持 -P ,您可以使用 grep 和 sed 的组合:
find . -type f -name '*.nfo' | xargs grep -o '<user>.*</user>' | sed 's:</\?user>::g'

输出:
./file1.nfo:test1
./file2.nfo:test2

请注意,您应该注意 issues involved with passing files on to xargs 也许使用 -exec ...反而。

关于regex - Shell 脚本 - 列出文件、读取文件并将数据写入新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15809477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com