Bash shell中的分隔符不正确

Bash shell中的分隔符不正确,bash,Bash,我试图迭代bash脚本的几行,并回显所有非注释行 在我的循环中,我有以下命令: echo $line | cut -d" #" -f1 但是,解释器向我抛出以下错误: cut: bad delimiter 我做错了什么?您可以使用awk: awk '$1 !~ /^#/' file 仅打印第一个字段中不以#开头的行 如果要测试字符串是否为注释: if [[ ! $(awk '$1 !~ /^#/' <<<"$string") ]]; then echo "'$st

我试图迭代bash脚本的几行,并回显所有非注释行

在我的循环中,我有以下命令:

echo $line | cut -d" #" -f1
但是,解释器向我抛出以下错误:

cut: bad delimiter

我做错了什么?

您可以使用
awk

awk '$1 !~ /^#/' file
仅打印第一个字段中不以
#
开头的行

如果要测试字符串是否为注释:

if [[ ! $(awk '$1 !~ /^#/' <<<"$string") ]]; then
    echo "'$string' is a comment"
else
    echo "'$string' is not a comment"
fi

如注释中所述,
-d
参数到
cut
只需要一个字符。尝试使用
nawk
代替您的示例:

echo $line | nawk 'BEGIN {FS=" #" } ; { print $1 }'
或者只打印不以“#”开头的行,请使用
grep

grep -v " #" <file>
grep-v“#”
或者只打印以散列开头的行,或者只打印空格和散列,我将使用Perl:

perl -n -e 'unless (/(\S+)*#/) {print}' <file>
perl-n-e'除非(/(\S+)*#/){print}'

为了完整起见,请使用
sed

sed '/^\S*#/d' file

这本质上是说,输出所有不以任何空格开头并后跟
的行。这是一个现代版本的
sed
,因此旧版本的sed可能需要使用其他内容来进行空格匹配。

可能重复的
-d
选项似乎只允许使用一个字符作为分隔符。不清楚
-d”#“
要做什么
#
在bash中引入了一条注释,但前面不必加空格。@KeithThompson:实际上,大多数情况下都需要加空格。“以#开头的单词会导致忽略该单词和该行上的所有剩余字符。”因此
(#这是一条注释
——因为
是自定界的,但
。[#这不是注释
(当然,#前面有空格这一事实并不能证明它是注释。它可以在引用的单词中。)使用
nawk
而不是
awk
的任何特殊原因?如果行以
或制表符开头怎么办?@Keith在我的Solaris 10系统上,awk没有产生所需的输出。nawk产生了。OP没有指定他们正在使用的系统。@John-同意,但从OP给出的示例来看,他们的行似乎以一个空格后跟一个散列。但是我会改变我的答案,也给这个选项。@Warwick:这一点很好——但我认为Solaris的默认版本仍然是非常旧的
awk
sed '/^\S*#/d' file