ked*_*ink 3 scripts text-processing 20.04
我有十个文件:firstFile.txt,...,tenthFile.txt
在文件的最后一行,我想附加文件名。
即对于第一个,最后一行将是firstFile
我想用一行代码执行此操作。
我是个新手,所以不知道该尝试什么,我的猜测是这样的echo * >> *.txt,但并不感到惊讶,因为它不起作用
Zan*_*nna 14
例如,可以通过使用for循环来实现这一点,其语法如下:
for var in values; do things; doneRun Code Online (Sandbox Code Playgroud)
此代码将列表中的第一个值values放入var并things对其执行,然后将下一个值放入var,依此类推。
我们经常使用它对一堆文件执行相同的操作,就像您想要在此处执行的操作一样。
您可以使用一些合适的表达式让 Bash 创建文件列表(值列表,正如我上面所说的那样)。这里我建议你使用*File.txt. shell 会将其扩展为当前目录中以File.txt. 所以你的代码的第一位可能是
for f in *File.txt; do
Run Code Online (Sandbox Code Playgroud)
您可以为f变量使用其他名称,例如file. 我建议使用小写字母或单词(shell 中已经使用大写单词定义了其他变量,我们不想覆盖它们)。当我们在 Bash 中调用变量时,我们在其名称前面加上$. $f因此,您可以使用或引用变量$file,shell 会将其扩展为该变量的当前值。为了防止结果进一步扩展,我们几乎总是使用双引号,所以$f我不会写 ,而是"$f"在调用变量时写。
要将一些文本发送到文件中,您可以使用简单的工具,例如printf或echo重定向。您已经证明您知道如何使用重定向将内容附加到文件。这:替换的内容并附加到。stuff > filefilestuffstuff >> filestufffile
我们应该非常小心重定向,因为我们可以很容易地覆盖我们的重要文件 - 您甚至不会收到有关它的警告。因此,在运行如此强大的命令之前,您可能需要在另一个目录中备份文件,和/或进行一次试运行,仅检查将要操作的文件,如下所示:
for f in *File.txt; do echo "$f"; done
Run Code Online (Sandbox Code Playgroud)
上面只是返回将要操作的文件列表。
那么让我们回到如何向文件添加文本。由于我们的变量中已经有文件名,因此我们可以使用它来生成文本。
以下是您的代码的外观echo:
for f in *File.txt; do echo "$f" >> "$f"; done
Run Code Online (Sandbox Code Playgroud)
对于firstFile.txt,它将运行echo firstFile.txt >> firstFile.txt,依此类推,对于 匹配的所有其他文件*File.txt。
但您提到您的文件以以下结尾.txt,并且您不希望将其出现在附加文本中。
为了避免这种情况,您可以执行一些字符串操作
for f in *File.txt; do echo "${f%.*}" >> "$f"; done
Run Code Online (Sandbox Code Playgroud)
这将从中的字符串的最后${f%.*}一个字符开始修剪字符,在本例中为..$f.txt
您也可以使用printf. 它值得学习,因为它比 更灵活echo,而且据我所知,也更可靠。
for f in *File.txt; do printf '%s\n' "${f%.*}" >> "$f"; done
Run Code Online (Sandbox Code Playgroud)
'%s\n'用于格式化 -%s意味着文本是字符串(例如,不是数字)并\n在其后附加换行符(echo自动附加换行符)。
| 归档时间: |
|
| 查看次数: |
3139 次 |
| 最近记录: |