似乎其他人都希望删除任何额外的空格,但我有相反的问题.
我有一个文件,称之为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删除了字符之间的额外空格,无论如何要解决这个问题?
看看这个例子:
$ 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在其中包含一些验证.)
我声明s和e作为整数变量,然后甚至bash可以对它们做一些简单的算术并计算要打印的实际最后一行.