似乎其他人都希望删除任何额外的空格,但是我遇到了相反的问题。
我有一个文件,称之为
的some_file.txta b c d
and some more
我正在用sed,
逐行阅读num_lines=$(cat some_file.txt | wc -l)
for i in $(seq 1 $num_lines); do
echo $(sed "${i}q;d" $file)
string=$(sed "${i}q;d" $file)
echo $string
done
我希望空白字符的数量保持不变,但我得到的输出是
a b c d
a b c d
and some more
and some more
所以似乎问题是sed删除了字符之间的额外空格,无论如何要解决这个问题?
答案 0 :(得分:5)
看一下这个例子:
$ echo Hello World
Hello World
$ echo "Hello World"
Hello World
sed
不是您的问题,您的问题是bash在将sed
的输出传递到echo
时删除了空格。
你只需要用双引号包围应该打印的任何echo
。而不是
echo $(sed "${i}q;d" $file)
echo $string
你写
echo "$(sed "${i}q;d" $file)"
echo "$string"
新脚本应如下所示:
#!/usr/bin/env bash
file=some_file.txt
num_lines=$(cat some_file.txt | wc -l)
for i in $(seq 1 $num_lines); do
echo "$(sed "${i}q;d" $file)"
string=$(sed "${i}q;d" $file)
echo "$string"
done
打印正确的输出:
a b c d
a b c d
and some more
and some more
但是,如果您只想逐行浏览文件,我强烈推荐这样的内容:
while IFS= read -r line; do
echo "$line"
done < some_file.txt
评论中的问题:如果您只想要从第x行开始的33行,该怎么办。一种可能的解决方案是:
#!/usr/bin/env bash
declare -i s=$1
declare -i e=${s}+32
sed -n "${s},${e}p" $file | while IFS= read -r line; do
echo "$line"
done
(请注意,我可能还会在其中包含$1
的一些验证。)
我将s
和e
声明为整数变量,然后即使bash
也可以对它们进行一些简单的算术运算,并计算要打印的实际最后一行。