Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed DON';不要删除多余的空格_Bash_Sed - Fatal编程技术网

Bash sed DON';不要删除多余的空格

Bash sed DON';不要删除多余的空格,bash,sed,Bash,Sed,似乎其他人都想删除任何额外的空白,但我有相反的问题 我有一个文件,称之为某个_file.txt a b c d and some more 我和塞德一行一行地读着 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 $stri

似乎其他人都想删除任何额外的空白,但我有相反的问题

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

a     b c     d
and    some     more
我和塞德一行一行地读着

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似乎存在删除字符之间额外空白的问题,无论如何,要解决这个问题?

看看这个例子:

$ 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
while IFS= read -r line; do
    echo "$line"
done < some_file.txt
打印正确的输出:

a     b c     d
a     b c     d
and    some     more
and    some     more
但是,如果您只想逐行查看文件,我强烈建议您这样做:

#!/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
while IFS= read -r line; do
    echo "$line"
done < some_file.txt
(请注意,我可能还会在其中包含一些对
$1
的验证。)


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

这没有意义,字符串赋值和echo与minenop一样精确,无论
echo
被要求打印的内容是什么,我都用引号括起来。我正试图逐行检查文件,但是只有从第#行开始的x(=33)行(由$1指定),还有比使用sed更好的方法吗?我更新了一个可能的解决方案。可能有一百种不同的类型。注意,while循环仍然会吞噬空格,即如果行以空格开头;您必须在IFS=read时使用
,以避免这种情况。最好使用
read-r
来避免反斜杠转义的解释,请参阅