我有一个作业说“使用 bash 脚本和命令行工具,实现以下功能:您创建的脚本应该像这样运行:并且它应该处理该目录中的 *.txt 文件。此处理包括以下步骤: 1. make all字母小写 2. 删除所有 xml/html 标签 3. 替换文本文件中找到的所有首字母缩略词 4. 将所有数字转换为单词 提示:-您可以使用 sed 命令。”
我已经编写了如图所示的代码。实际上我对 Linux 很陌生,所以我必须搜索不同的命令才能完成这项工作。然而,根据作业的要求,输出实际上应该创建另一个文件,并将修改后的内容(在应用 4 个进程之后)写入到该新文件上,而不是在终端上单独打印每个操作。
代码:
#1. Converts all text inside file 1.txt to lowercase
tr '[A-Z]' '[a-z]' < 1.txt
#2. Removes html/xml tags from the text
sed -e 's/<['^]>'*>//g' 1.txt
#3 Replaces all acronyms with full names
sed 's/doc/document/' 1.txt
#4 Converts all numbers to full words
sed 's/2/two/' 1.txt
文件文本:这是一个随机文档。有 2 个这样的文档。 <b>我不在乎</b>
预期输出:这是一个随机文档。有两份这样的文件。我不在乎
谢谢!
答案1
看来您的问题是您的命令都没有修改该文件;它们都写入标准输出(即在终端窗口中显示结果)。一般来说,我想到两种方法:
复制文件并使用选项标志,使您的命令就地修改复制的文件,或者
使用管道和输出重定向来应用所有操作并将结果写入新文件。
第一种方法的一个问题是并非每个命令行程序都支持就地文件修改。在这种情况下,恰好sed
有一个选项可以就地编辑文件;使用-i
选项标志告诉sed
就地编辑文件。该tr
程序不支持就地编辑,但是您可以轻松地tr
用命令替换您的命令sed
。这可能会导致我们得到类似于以下(稍作修改)版本的脚本:
#0. Create a copy of the file
cp -i 1.txt 2.txt
#1. Converts all text inside file 2.txt to lowercase
sed -i -e 's/\(.*\)/\L\1/' 2.txt
#2. Removes html/xml tags from the text
sed -i -e 's/<['^]>'*>//g' 2.txt
#3 Replaces all acronyms with full names
sed -i -e 's/doc/document/' 2.txt
#4 Converts all numbers to full words
sed -i -e 's/2/two/' 2.txt
如果我们想使用管道和重定向,我们最终可能会得到如下替代方案:
cat 1.txt \
| sed -e 's/\(.*\)/\L\1/' \
| sed -e 's/<['^]>'*>//g' \
| sed -e 's/doc/document/' \
sed -e 's/2/two/' \
> 2.txt
请注意,这不是您作业的解决方案;而是您的作业的解决方案。它仅解决有关如何将更改写入文件的问题。