我有一系列要转换为降价的文本文件。我想删除任何前导空格并在每个文件的第一行添加一个井号。如果我运行这个:
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 上的),您可以遍历文件并每个调用一次:
for f in *.md; do sed -i.bak '1s/^ */#/' "$f"; done
请注意,这里的正则表达式有点简化 - 无需匹配您不会更改的部分行。
sed -rsi.bak '1s/^/#/;s/^[ \t]+//' *.md
您不需要在命令末尾使用 g(lobally) ,因为您不想在行首替换某些内容,而不是多次替换。
您使用两个命令,一个用于修改第 1 行 (1s...),第二个命令用于前导空格(和制表符?:=\t),用分号分隔。要删除第一行中的空白,请切换顺序:
sed -rsi.bak 's/^[ \t]+//;1s/^/#/' *.md
如果不需要,请删除 \t。那么你也不需要一个组:
sed -rsi.bak 's/^ +//;1s/^/#/' *.md
-r 是表示对正则表达式进行特殊处理的标志。在这种情况下,您不需要掩盖加号。
XARgs 将为您解决问题:
http://en.wikipedia.org/wiki/Xargs
从 sed 命令末尾删除 *.md,然后使用 XArgs 一次收集一个文件并将它们作为一个实体发送到您的 sed 命令,抱歉,我没有时间为您解决问题,但是wikiPedia 文章应该向您展示您需要了解的内容。