我在MacOS10.14.6上,有一个包含所有文本文件的子目录的目录。总共有数百个文本文件。
我想查看文本文件,并检查第一行中的任何内容,即括号中的内容。如果找到这样的内容,则应该删除括号(以及括号中的内容)。
示例:
驱逐前:
The new world (82 edition)
驱逐后:
The new world
我该怎么做?
我尝试过的步骤:
谷歌周围,似乎SED将是最好的。我找到了this thread,它提供了删除括号内内容的SED代码。
sed -e 's/([^()]*)//g'
但是,我不知道如何调整它来处理多个文件,也不知道如何将它限制在这些文件的第一行。我找到了this thread,它解释了如何在多个文件上使用SED,但我不确定如何调整示例以处理括号内容。
请注意:只要该解决方案在Mac终端上工作,那么它就不需要使用SED。然而,从谷歌上看,SED似乎是最合适的。
发布于 2020-01-14 16:18:27
我通过使用bash脚本和sed一起实现了您所追求的目标,如下所示:
#!/bin/bash
for filename in $PWD/*.txt; do
sed -i '' '1 s/([^()]*)//g' $filename
done
脚本只需遍历$PWD中的所有$PWD文件(当前的工作目录,以便您可以将此脚本添加到bin中并在任何地方运行),然后运行命令
sed -ie '1 s/([^()]*)//g' $filename
在文件上。通过使用数字1
启动命令,我们告诉sed只在文件的第一行上工作:)
编辑:最佳答案
在一个目录中,所有包含的对象都是文件,而不包括目录,上面的内容可以很好地工作;换句话说,上面没有对目录执行递归搜索。
因此,经过一些研究后,这个命令应该完全按照问题要求执行:
find . -name "*.txt" -exec sed -i '' '1 s/([^()]*)//g' {} \;
我必须迭代并重申,您首先要在备份上测试它才能正常工作。否则,使用与上面相同的命令,但更改“”以控制备份的创建。例如,
find . -name "*.txt" -exec sed -i '.bkp' '1 s/([^()]*)//g' {} \;
此命令将在原始文件中执行sed替换(保留文件名),但将为每个文件创建一个备份文件,其中包含附加的.bkp
,例如,test1.txt
变成test1.txt.bkp
。这是一个更安全的选择,但要选择对您最有效的方法:)
发布于 2020-01-14 16:17:22
好的尝试,
查找单行的命令:
sed -E '1s|\([^\)]+\)||'
第一行替换每个输入文件的命令:
sed -Ei '1s|\([^\)]+\)||' *.txt
示例:
echo "The new world (82 edition)" |sed -E '1s|\([^\)]+\)||'
The new world
解释
sed -Ei
E
选项:扩展RegExp语法,i
选项:用于就地文件替换
sed -Ei '1s|match RegExp||'
仅用于第一行,将第一个匹配的RegExp字符串替换为空字符串。
\([^\)]+\)
RegExp匹配:从(
开始,以[^\)]
开始,而不是)
,+
-不止一次,终止于)
。
发布于 2020-01-15 02:21:56
尝试:
# create a temporary file
tmp=$(mktemp)
# for each something in _the current directory_
for i in *; do
# if it is not a file, don't parse it
if [ ! -f "$i" ]; then continue; fi
# remove parenthesis on first line, save the output in temporary file
sed '1s/([^)]*)//g' "$i" > "$tmp"
# move temporary file to the original file
mv "$tmp" "$i"
done
# remove temporary file
rm "$tmp"
https://stackoverflow.com/questions/59737456
复制相似问题