根据内部文本匹配重命名文件-保留文件的所有内容

诺斯

仍然难以确定如何使用以下代码来保存给定文件的内容,该代码试图根据文件中的特定正则表达式匹配来重命名该文件(即,在给定文件中,总会有一个SMILE后跟12位数字,例如SMILE000123456789)。

for f in FILENAMEX_*; do awk '/SMILE[0-9]/ {OUT=$f ".txt"}; OUT {print >OUT}' ${f%.*}; done

这段代码正确地命名了文件,但只是简单地打印出匹配后的所有内容,而不是文件的全部内容。

当前要处理的文件列表没有扩展名(下一步需要一个扩展名),因为我csplit用来解析较大文件中的内容。

本杰明W.

有两个问题:第一个是在awk程序中使用shell变量,第二个是awk程序本身的逻辑。

要在awk中使用shell变量,可以使用

awk -v var="$var" '<program>'

然后var在awk内部使用

对于第二个问题:如果某行与您的图案不匹配OUT且未设置,则不会打印该行。在与图案匹配的第一行之后,OUT进行设置并打印。由于匹配项可能在文件中的任何位置,因此您必须至少存储行直到第一个匹配项。

这是一个应该工作的版本,非常接近您的方法:

for f in FILENAMEX_*; do
    awk -v f="${f%.*}" '
        /SMILE[0-9]/ {
            out=f".txt"
            for (i=1;i<NR;++i)         # Print file so far
                print lines[i] > out
        }
        out { print > out }            # Match has been seen: print
        ! out { lines[NR] = $0 }       # No match yet: store
    ' "$f"
done

您可以FILENAME通过一次awk的调用来进行一些欺骗性工作,或使用类似方法完成所有工作,但是由于主要目的是查找文件中是否存在模式,因此最好使用grep -q,它返回退出状态如果找到该模式,则为0:

for f in FILENAMEX_*; do grep -q 'SMILE[0-9]' "$f" && cp "$f" "${f%.*}".txt; done

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何根据文本文件中的匹配重命名tar.gz文件

根据另一个文件内容中的完全匹配重命名文件名的一部分

根据同一文件夹中的部分文件名匹配重命名文件名的子字符串

删除保留所有内容的父文件夹

根据文件内容重命名文件夹中的所有txt文件

获取 Windows 批处理文件以根据通配符匹配的内容重命名文本文件

将大型目录树中的所有文件大小归零(删除文件内容,保留文件)

尝试根据文本文件重命名文件

重命名文件方括号之前的所有内容

根据目录中包含的文本重命名目录中的所有文件

根据 R 中 datafrom 的匹配值重命名文件

重命名编号的文件,同时保留文本

根据内容重命名文件

根据内容重命名 JSON 文件

根据JSON内容重命名文件

将所有内容保留在Excel文件中的引号之间

如何删除json文件中对象内的所有内容但保留对象?

重命名目录中的所有文件,同时保留任何文件扩展名

根据列表重命名文件

根据文件内容重命名文件文件夹

ubuntu脚本仅保留每个文件夹的最新文件并删除其他所有内容

根据内容中的多个字符串重命名文本文件

根据文本文件中包含的文本重命名目录中的文件

macos 通過保留最後 n 個字符來重命名所有文件

根据 *txt 文件的内容重命名 *txt 文件

根据文件内容重命名txt文件(OSX)

如果匹配文件的内容,则重命名大量文件夹

在 Unix shell 脚本中,根据文件第一行中的匹配字符串重命名文本文件

重命名文件,同时保留部分内容