我有一个包含 3 个文件的目录:a.txt b.txt c.txt 我必须从每个文件中删除前 4 行 我想在 Cygwin 中使用“sed”或“awk”等 我这样做:
for x in `ls`; do
sed '1,4d' $x
done
它工作正常,但我需要将输出放在新创建的文件中,例如 a2.txt b2.txt c2.txt。我该如何重构我的循环?谢谢
答案1
假设您在 Cygwin 中使用 bash 作为您的 shell(这是默认设置),您可以按如下方式使用 bash 参数扩展功能:
for x in *.txt; do
sed '1,4d' $x > ${x%.txt}2.txt
done
关键是${x%.txt} 删除文件名后缀(.txt),然后附加“2”和“.txt”作为示例。
还有其他重构:使用“ ls
”来获取需要编辑的文件列表是多余的,使用 shell 本身的路径名扩展就足够了。
答案2
for x in *; do
sed '1,4d' $x > $(basename $x .txt)2.txt
done
或者
for x in *; do
sed '1,4d' $x > ${x/./2.}
done