删除目录中 .txt 文件开头和结尾的字符串?

删除目录中 .txt 文件开头和结尾的字符串?

我的目录中有一组单行 .txt 文件。它们都具有相同的基本格式,我将其粘贴在下面标记为“输入”的位置:

对于目录中的每个文件,我想删除开头和结尾的字符串,以便我只拥有我感兴趣的文本,以便每个文件看起来“输出”:

输入:
<s> Text here that I want to keep </s> (31ca4166c37a_.76)

输出:
Text here that I want to keep

任何帮助将不胜感激。

答案1

使用旧的方法ed来编辑文件:

for file in dir/*.txt; do
  ed -s "$file" <<'EOF'
s!^<s> *!!
s!</s>.*$!!
w
EOF
done

(一般来说,大多数时候您发现自己在考虑非标准sed -i,您应该考虑使用ed。)

答案2

与 sed

sed -i.bak 's|^<\/s>\s\(.*\)\s<\/s>.*$|\1|' 1-line.txt

测试

echo "</s> Text here that I want to keep </s> (31ca4166c37a_.76)" | sed 's|^<\/s>\s\(.*\)\s<\/s>.*$|\1|'
Text here that I want to keep

要应用到文件夹中的所有文件,仅使用 sed 是无法做到的。您至少需要find一起使用该实用程序:

find . -type f -exec sed -i.bak 's|^<\/s>\s\(.*\)\s<\/s>.*$|\1|' {} \;

此命令将为.bak每个更改的文件创建一个文件。

笔记:

  • -i命令的参数是sedGNU 扩展名,因此,如果您在 BSD 上运行此命令,sed则需要将输出重定向到新文件,然后重命名它。
  • 尽管在 POSIX 中指定,但某些find实现没有参数-exec,因此您需要使用 a| xargs代替。

答案3

我建议这样:

sed 's;^[[:blank:]]*<[^>]*>[[:blank:]]*\(.*\)<.*>.*$;\1;' foo

输出:

Text here that I want to keep

如果标签有多个字母和任意字母,并且删除开头和结尾处的所有空格,则此方法有效,例如:

<br> Text here that I want to keep    </br> (31ca4166c37a_.76)

答案4

对于任何 POSIX awk(假设 every<s></s>do 在每一行上都按顺序对出现,如您提供的示例输入中所示):

$ awk -F'[[:blank:]]*</?s>[[:blank:]]*' '{print $2}' file
Text here that I want to keep

使用 GNU awk 进行\s简写:

$ gawk -F'\\s*</?s>\\s*' '{print $2}' file
Text here that I want to keep

对于任何 POSIX sed:

$ sed 's|[[:blank:]]*<s>[[:blank:]]*\(.*[^[:blank:]]\)[[:blank:]]*</s>.*|\1|' file
Text here that I want to keep

相关内容