我的目录中有一组单行 .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
命令的参数是sed
GNU 扩展名,因此,如果您在 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