以下命令:
head -n 1 $FILE | tail -n 1
从 的第一行提取文本$FILE
。 中每行的格式$FILE
如下:
1 2 3 4 2 3 3 4 5 4 5 6 7 8 9
如您所见,每个字符之间都由一个空格分隔。每个组之间都由两个空格分隔。使用sed
I 需要删除单个空格,并将双空格转换为单个空格。
中的文本$FILE
由嵌套在另一个 for 循环中的 for 循环创建。因此,在嵌套 for 循环运行完毕后,每行上的文本数据都会从主 for 循环重定向>>
到$FILE
。文本字符串中的每个字符/数字都是嵌套 for 循环完成一次的结果。然后,主 for 循环将嵌套 for 循环的输出发送到$FILE
。
伪代码的一个例子是:
for i in $(seq 1 $RANDOM)
do
for n in {1..10}
do
$do_something
done
$do_something_else
done >> $FILE
head -n 1 $FILE | tail -n 1 | (sed command here)
上述代码的结构与此处的需求无关。我只是寻求一种轻量级方法,用于上述有关空格的文本操作。如果之前有人问过这个问题,我很抱歉。我在查询中找不到它。
答案1
这应该有效:
sed 's/ \([^ ]\)/\1/g'
您还可以用以下内容替换脚本的整个最后一行:
sed -n '1s/ \([^ ]\)/\1/gp' "$FILE"
答案2
这个怎么样:
$ head -n1 $FILE | tail -n 1 | sed 's, ,|,g' | sed 's, ,,g' | sed 's,|, ,g'
1234 23 345 456789
首先,我们用 替换所有出现的双空格,|
以将它们与单个空格区分开来,然后我们删除所有单个空格,最后我们|
用单个空格替换。
答案3
s
您可以在 sed 中使用单个命令完成替换:
s/ \( \?\)/\1/g
要在第一行之后退出,我们可以q
在第一行退出。把它们放在一起:
sed -e 's/ \( \?\)/\1/g' -e '1q'