我有一些文本文件需要转换为markdown。我想要删除任何前导空格,并在每个文件的第一行添加一个#号。如果我运行以下命令:
sed -i.bak '1s/ *\(.*\)/\#\1/g' *.md
它修改第一个文件的第一行并处理所有文件,而其余文件保持不变。
我错过了什么可以在多个文件的第n行搜索和替换内容?
在OSX 10.7上使用bash。
问题在于sed默认将任意数量的文件视为单个流,因此行号偏移量相对于第一个文件的开头。
对于GNU sed,您可以使用-s (--separate
)标志来修改此行为:
sed -s -i.bak '1s/^ */#/' *.md
如果使用非GNU Sed(包括Mac OS X上的Sed),则可以循环遍历文件并针对每个文件分别调用:
for f in *.md; do sed -i.bak '1s/^ */#/' "$f"; done
请注意,这里的正则表达式有点简化--没有必要匹配您不打算更改的行部分。
XARgs 可以为您解决问题:
从您的sed命令末尾删除*.md,然后使用XArgs逐个收集文件并将它们作为单个实体发送到您的sed命令中。很抱歉我没有时间为您解决问题,但维基百科文章应该会告诉您需要了解的内容。sed -rsi.bak '1s/^/#/;s/^[ \t]+//' *.md
在命令末尾不需要使用g(全局),因为你想要替换的是行首而非多个位置。
你需要使用两个命令,一个用于修改第一行(1s...),另一个用于带前导空格(和制表符?:=\t)的空白,中间使用分号隔开。如果你需要删除第一行中的空格,可以更改顺序:
sed -rsi.bak 's/^[ \t]+//;1s/^/#/' *.md
sed -rsi.bak 's/^ +//;1s/^/#/' *.md
-r是一个标志,用于表示正则表达式的特殊处理。在这种情况下,您无需掩盖加号。
sed
的版本是多少?它在 Ubuntu 12.04 上运行良好。 - kev-s
标志应该是必需的,以便将各个文件视为单独的流。话虽如此,OS X不使用GNU工具,因此他可能需要采用shell循环方法。 - Charles Duffy