Answers:
sed /^#/d
sed '/^#/ d' < inputFile.txt > outputFile.txt
sed -i '/^#/d' filepath
。
sed -i '' '/^#/d' filepath
在Mac(因为-i后缀是强制性的)
awk '/^#/ && !first { first=1 ; next } { print $0}'
我有点惊讶,没有人提出最明显的解决方案:
grep -v '^#' filename
这样解决了上述问题。
但请注意,一个通用约定是将从a #
到行尾的所有内容都视为注释:
sed 's/#.*$//' filename
但是,例如,它将#
字符串文字中的字符视为注释的开头(可能与您的情况无关)(并且留空行)。
以任意空格开头的行,其后#
也可能被视为注释:
grep -v '^ *#' filename
如果空格只是空格,或者
grep -v '^[ ]#' filename
其中两个空格实际上是一个空格,后跟一个文字制表符(键入“ control-v制表符”)。
对于所有这些命令,请忽略filename
要从标准输入读取的参数(例如,作为管道的一部分)。
grep -v "^#" filename
您可以直接使用
sed -i '/^#/ d'
如果您还想删除以空格开头的注释行
sed -i '/^\s*#/ d'
通常,如果要保留脚本的第一行(如果是shabang),sed
则不要删除以开头的行#!
。它也应该删除仅包含哈希而不包含文本的行。放在一起:
sed -i '/^\s*\(#[^!].*\|#$\)/d'
为了与所有sed变体保持一致,您需要在该-i
选项中添加备用扩展名:
sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak
您可以将以下内容用于awk解决方案-
awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile
这是带有所有扩展名的所有文件的循环:
ll -ltr *.filename_extension > list.lst
for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls
do
echo $i
sed -i '/^#/d' $i
done
#blah \<nl>blah
因为反斜杠转义了换行符,它是否必须与被视为单个“逻辑行” 的通用约定一起工作?