首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Sed & Mac终端:如何从每个文件的第一行删除括号内容?

Sed & Mac终端:如何从每个文件的第一行删除括号内容?
EN

Stack Overflow用户
提问于 2020-01-14 15:57:05
回答 3查看 545关注 0票数 0

我在MacOS10.14.6上,有一个包含所有文本文件的子目录的目录。总共有数百个文本文件。

我想查看文本文件,并检查第一行中的任何内容,即括号中的内容。如果找到这样的内容,则应该删除括号(以及括号中的内容)。

示例:

驱逐前:

代码语言:javascript
运行
复制
The new world (82 edition)

驱逐后:

代码语言:javascript
运行
复制
The new world 

我该怎么做?

我尝试过的步骤:

谷歌周围,似乎SED将是最好的。我找到了this thread,它提供了删除括号内内容的SED代码。

代码语言:javascript
运行
复制
sed -e 's/([^()]*)//g'

但是,我不知道如何调整它来处理多个文件,也不知道如何将它限制在这些文件的第一行。我找到了this thread,它解释了如何在多个文件上使用SED,但我不确定如何调整示例以处理括号内容。

请注意:只要该解决方案在Mac终端上工作,那么它就不需要使用SED。然而,从谷歌上看,SED似乎是最合适的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-14 16:18:27

我通过使用bash脚本和sed一起实现了您所追求的目标,如下所示:

代码语言:javascript
运行
复制
#!/bin/bash

for filename in $PWD/*.txt; do
    sed -i '' '1 s/([^()]*)//g' $filename
done

脚本只需遍历$PWD中的所有$PWD文件(当前的工作目录,以便您可以将此脚本添加到bin中并在任何地方运行),然后运行命令

代码语言:javascript
运行
复制
sed -ie '1 s/([^()]*)//g' $filename

在文件上。通过使用数字1启动命令,我们告诉sed只在文件的第一行上工作:)

编辑:最佳答案

在一个目录中,所有包含的对象都是文件,而不包括目录,上面的内容可以很好地工作;换句话说,上面没有对目录执行递归搜索。

因此,经过一些研究后,这个命令应该完全按照问题要求执行:

代码语言:javascript
运行
复制
find . -name "*.txt" -exec sed -i '' '1 s/([^()]*)//g' {} \;

必须迭代并重申,您首先要在备份上测试它才能正常工作。否则,使用与上面相同的命令,但更改“”以控制备份的创建。例如,

代码语言:javascript
运行
复制
find . -name "*.txt" -exec sed -i '.bkp' '1 s/([^()]*)//g' {} \;

此命令将在原始文件中执行sed替换(保留文件名),但将为每个文件创建一个备份文件,其中包含附加的.bkp,例如,test1.txt变成test1.txt.bkp。这是一个更安全的选择,但要选择对您最有效的方法:)

票数 1
EN

Stack Overflow用户

发布于 2020-01-14 16:17:22

好的尝试,

查找单行的命令:

代码语言:javascript
运行
复制
sed -E '1s|\([^\)]+\)||'

第一行替换每个输入文件的命令:

代码语言:javascript
运行
复制
sed -Ei '1s|\([^\)]+\)||' *.txt

示例:

代码语言:javascript
运行
复制
echo "The new world (82 edition)" |sed -E '1s|\([^\)]+\)||'
The new world

解释

sed -Ei E选项:扩展RegExp语法,i选项:用于就地文件替换

sed -Ei '1s|match RegExp||'仅用于第一行,将第一个匹配的RegExp字符串替换为空字符串。

\([^\)]+\) RegExp匹配:从(开始,以[^\)]开始,而不是)+ -不止一次,终止于)

票数 1
EN

Stack Overflow用户

发布于 2020-01-15 02:21:56

尝试:

代码语言:javascript
运行
复制
# 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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59737456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档