sed不要删除额外的空格

时间:2016-03-04 00:20:48

标签: bash sed

似乎其他人都希望删除任何额外的空格,但是我遇到了相反的问题。

我有一个文件,称之为

的some_file.txt
a     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删除了字符之间的额外空格,无论如何要解决这个问题?

1 个答案:

答案 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的一些验证。)

我将se声明为整数变量,然后即使bash也可以对它们进行一些简单的算术运算,并计算要打印的实际最后一行。