我有一个包含多个文本文件的文件夹。
apple.txt、book.txt、tooth.txt 等
我创建了一个包含多个 sed 命令的 bash 脚本来处理每个文本文件,如下所示:
...
find /directory/. -type f -exec sed -i 's/one/two/g' {} \;
...
这些线路工作正常。
有没有一种方法可以以类似的方式(单个命令)处理所有单独的文本文件来执行这些操作:
从最长到最短的字符串对行进行排序(每一行包含一个字符串 - 没有空格)。
删除任何重复的行。
答案1
我不确定单个命令的要求是什么,但这非常接近:
(cd /directory/; find -type f -printf '%P\0' | while IFS= read -r -d '' fn; do
awk '{ print length, $0 }' "$fn" | sort -nur | sed -r 's/^[0-9]+ //' > "$fn.~"
mv "$fn.~" "$fn"
done)
第一行只是以尽可能稳健的方式读取文件名。
第二行是所有工作发生的地方:
- awk 在每行的开头添加字符数(+ 空格)
- sort -n(数字)、-u(唯一)和 -r(反向)处理文件
- sed 删除前导字符计数
- 然后它被转储到临时文件
然后 mv 行将临时文件写入原始文件(因为在管道期间无法完成)。