Mac上的命令行。有一些文本文件。希望从一组文件中删除某些行,然后将文件的其余文本猫到一个新的合并文件中。目前有以下尝试:
for file in *.txt;
do echo $file >> tempfile.html;
echo ''>>tempfile.html;
cat $file>>tempfile.html;
find . -type f -name 'tempfile.html' -exec sed -i '' '3,10d' {} +;
find . -type f -name 'tempfile.html' -exec sed -i '' '/<ACROSS>/,$d' {} +;
# ----------------
# some other stuff
# ----------------
done;我正在从一堆文件中提取一段文本,并将它们全部连接在一起,但仍然需要知道每个选择来自哪个文件。首先,我连接文件的名称,然后(据说)从每个文件中选择文本。然后重复这个过程。
此外,我需要保留原来的文本文件,以供其他用途。
因此,连接的文件将是:
filename1.txt
text-selection
more_text
filename2.txt
even-more-text
text-text-test-test第一个SED应该从第3行删除到第10行,第二个SED应该从包含到文件末尾的行中删除。
然而,首先要删除的是tempfile中的所有内容。第二个是无所事事。(分别进行测试)
我做错了什么?
我一定是漏掉了什么。即使是尝试--看起来是--一个非常简单的例子也是行不通的。我希望,下面的示例可以删除第3-10行,但将文件的其余部分保存到test.txt中。
sed '3,10d' nxd2019-01-06.txt > test.txt发布于 2018-12-18 01:32:09
您对find的调用将尝试使用尽可能多的每次调用文件来运行sed。但请注意:sed中的地址并不是每个输入文件中的地址行,它们解决了sed的全部输入(可以由多个输入文件组成)
试试这个:
> a.txt cat <<EOF
1
2
EOF
> b.txt cat <<EOF
3
4
EOF现在试试这个:
sed 1d a.txt b.txt
2
3
4如您所见,sed从a.txt中删除了第一行,而不是从b.txt中删除
在您的例子中,问题是第二次调用find。如果将从第一次出现的find中删除所有内容,直到 ACROSS找到的最后一个文件中的最后一行为止,这将有效地从第一个tempfile.html之外的所有内容中删除。
如果脚本中的其余逻辑工作正常,则只需将find调用更改为:
find . -type f -name 'tempfile.html' -exec sed -i '' '3,10d' {} \;
find . -type f -name 'tempfile.html' -exec sed -i '' '/<ACROSS>/,$d' {} \;这将在每个输入文件中调用一次sed。
https://stackoverflow.com/questions/53824712
复制相似问题