sed不要删除额外的空格

mtv*_*ezy 1 bash sed

似乎其他人都希望删除任何额外的空格,但我有相反的问题.

我有一个文件,称之为some_file.txt

a     b c     d
and    some     more
Run Code Online (Sandbox Code Playgroud)

我正在用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
Run Code Online (Sandbox Code Playgroud)

我希望空白字符的数量保持不变,但我得到的输出是

a b c d
a b c d
and some more
and some more
Run Code Online (Sandbox Code Playgroud)

所以似乎问题是sed删除了字符之间的额外空格,无论如何要解决这个问题?

chw*_*w21 5

看看这个例子:

$ echo Hello       World
Hello World
$ echo "Hello       World"
Hello       World
Run Code Online (Sandbox Code Playgroud)

sed是不是你的问题,你的问题是,通过庆典的输出时删除空格sed进入echo.

你只需echo用双引号包围任何应该打印的内容.而不是

echo $(sed "${i}q;d" $file)
echo $string
Run Code Online (Sandbox Code Playgroud)

你写

echo "$(sed "${i}q;d" $file)"
echo "$string"
Run Code Online (Sandbox Code Playgroud)

新脚本应如下所示:

#!/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
Run Code Online (Sandbox Code Playgroud)

打印正确的输出:

a     b c     d
a     b c     d
and    some     more
and    some     more
Run Code Online (Sandbox Code Playgroud)

但是,如果您只是想逐行浏览文件,我强烈推荐这样的事情:

while IFS= read -r line; do
    echo "$line"
done < some_file.txt
Run Code Online (Sandbox Code Playgroud)

评论中的问题:如果您只想要从第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
Run Code Online (Sandbox Code Playgroud)

(请注意,我可能还会$1在其中包含一些验证.)

我声明se作为整数变量,然后甚至bash可以对它们做一些简单的算术并计算要打印的实际最后一行.

  • 请注意,你的while循环仍然吞下空格,即如果该行以它开头; 你必须使用`而IFS = read`来避免这种情况.使用`read -r`来避免解释反斜杠转义总是一个好主意,请参阅http://mywiki.wooledge.org/BashFAQ/001 (2认同)