我需要从具有.php或.html扩展名的所有文件的最开头删除任何出现的换行符(在mac上回车)。换行符之间有 no 其他字符,如空格或任何东西。
例如(使用/ lf作为换行的示例):
/lf
/lf
<!doctype html>
或
/lf
<!doctype html>
应该减少到:
<!doctype html>
我发现删除换行符的一种方法是:
tr -d '\012'
但我不知道如何在特定文件中定位,更不用说前几行了。
所以我有以下内容:
find . \( -name "*.php" -or -name "*.html" \) | xargs grep -l "\012" | xargs sed -i -e "s/\012//g"
但是这不会只针对前几行,我也不完全确定它是否正确定位了换行符。
那么,有没有人有任何好主意?
答案 0 :(得分:2)
尝试:
sed -i '/./,$\!d' filename
甚至是发现:
find . \( -name "*.php" -or -name "*.html" \) -exec sed -i '/./,$\!d' {} \;
编辑:
\
可能不需要!d
,在我的shell中我需要逃避它,因为csh一直认为我是通过!
符号引用之前的事件。
编辑2:
所以/./,$\!d
,它看起来像胡言乱语,但这就是正在发生的事情。
.
,它不是空白行。因此,第一个地址是第一个与/./
匹配的非空行。,
分隔,它只是$
,即文件的结尾。因此,我们通过2个地址定义的区域是第一个非空白行,一直到文件末尾。d
表示。但是,通过使用d
,我们将删除从第一个非空白行开始到文件末尾的所有内容。!
命令前面使用d
来告诉sed,“好吧,做的恰恰相反我告诉你要这样做“。因此,我们不是删除从第一个非空白行开始到文件末尾的所有内容,而是完全相反,保留第一个非空行到文件末尾,这样就删除了所有内容。文件开头的空白行。可能有一些方法可以使用p
(打印)命令执行此操作,该命令与类似与删除相反,但实际上并不是那样。我确信有一些方法可以使用p
或!p
来完成此操作。
答案 1 :(得分:2)
如果已安装Perl,Perl适用于此类处理。你可以做一点“do .. until”循环,一旦找到一个带有非空格字符的行就会退出。在我的头顶:
do {
s/^\s$//;
} until ( /^\S/ );
(但要验证那些正则表达式首先执行您想要的操作!)
答案 2 :(得分:0)
使用:
find /path/to/root/directory -type f -exec tr -d '\012' {} \;
其中/ path / to / root / directory是查找所有文件以删除所有匹配项的顶级路径。
答案 3 :(得分:0)
如果您知道换行仅在第一行,例如10行,则可以更改SED命令,使其仅在前十行上运行。这是下面的1,10
。
xargs sed -i -e "1,10s/\012//g"