Bash 如何使用SED更改多个文件中的第n行?

Bash 如何使用SED更改多个文件中的第n行?,bash,sed,Bash,Sed,我有一系列的文本文件,我想转换成降价。我想删除所有前导空格,并在每个文件的第一行添加一个哈希符号。如果我运行这个: sed -i.bak '1s/ *\(.*\)/\#\1/g' *.md 它更改第一个文件的第一行并处理所有文件,而保持其余文件不变 我缺少什么可以搜索和替换多个文件第n行的内容 在OSX 10.7上使用bash时,问题在于默认情况下,sed将任意数量的文件视为单个流,因此行号偏移相对于第一个文件的开头 对于GNU sed,您可以使用-s(--separate)标志来修改此行为:

我有一系列的文本文件,我想转换成降价。我想删除所有前导空格,并在每个文件的第一行添加一个哈希符号。如果我运行这个:

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

请注意,这里的正则表达式有点简化——不需要匹配您不打算更改的部分行。

XARgs将为您提供以下技巧:

从sed命令的末尾删除*.md,然后使用XArgs一次收集一个文件,并将它们作为单个实体发送到sed命令。很抱歉,我没有时间为您解决这个问题,但是wikiPedia文章应该会告诉您需要了解的内容

sed -rsi.bak '1s/^/#/;s/^[ \t]+//' *.md
您不需要在命令末尾使用g(lobaly),因为您不需要在行的开头替换某些内容,也不需要多次替换

您使用两个命令,一个用于修改第1行(1s…),第二个命令用于前导空格(和制表符?:=\t),并用分号分隔。要删除第一行中的空白,请切换顺序:

sed -rsi.bak 's/^[ \t]+//;1s/^/#/' *.md
如果不需要,请删除\t。那么你也不需要一个团队:

sed -rsi.bak 's/^ +//;1s/^/#/' *.md

-r是一个标志,表示对正则表达式进行了特殊处理。在这种情况下,你不需要掩盖优点

问题不是将它们作为单个实体发送给sed,而是sed默认将任意数量的文件视为单个流,因此行号偏移量相对于第一个文件的开头。@Charles Duffy:请在回答中说明这一点。
sed
在您的系统上的版本是什么。它在Ubuntu12.04中运行良好。@kev确实如此——但这实际上与文档中的行为相反,文档中的行为表明,
-s
标志应该是将单个文件视为单独流所必需的。也就是说,OSX不使用GNU工具,所以他可能需要使用shell循环方法。谢谢,这正是我处理所有文件所需要的。我把你的第二个答案改成了第一行:对于*.md中的f;做sed-i.bak'1s/^*/#/g'“$f”;done@FrederickYocum感谢你指出这一疏忽;我将其作为编辑应用于答案。这是一个很好的观点——写问题的英文散文在前导空格修改是否适用于所有行而不是第一行方面是模棱两可的(尽管其他回答的人,包括我自己,采用了与“第一行”相反的含义)旨在适用于这两项变更的限制)。我很想从原作者那里得到关于原意的澄清……事实上,我认为问题中的“保留其余文件不变”这句话违背了这种解释。啊——现在我明白了。我的解释是
我想(删除所有前导空格)和(在每个文件的第一行添加一个哈希符号)。
,但现在你的解释
我想(删除所有前导空格并添加一个哈希符号)在每个文件的第一行。
对于我来说似乎更合理,给出了示例代码。那么,这一切都只是关于sed选项-s。