Answers:
要将多个空格的序列转换为制表符,但不保留单个空格:
sed 's/ \+ /\t/g' inputfile > outputfile
要对许多文件执行此操作:
for inputfile in *
do
sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done
要么
for inputfile in *
do
sed -i.bak 's/ \+ /\t/g' "$inputfile"
done
要么
find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;
sed: -e expression #1, char 1: unknown command: `.'
find
底部之一。
sed
不喜欢在备份扩展名前留空格。我已经编辑了答案。感谢您的报告。
如果您的角色是多个标签,则还可以使用tr -s
:
-s, --squeeze-repeats replace each input sequence of a repeated character
that is listed in SET1 with a single occurrence
例如:
my_file.txt | tr -s " "
所有空白将成为一个。
您可以使用sed
制表符替换许多空格:
用一个选项卡替换一个或多个空格的示例:
cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
仅使用的最简单答案bash
是:
while read -r col1 col2 col3 ...; do
echo -e "$col1\t$col2\t$col3..."
done <file
如果列数可变,则可以执行此操作,但它仅适用于bash
,不适用于sh
:
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <file
例如
while read -r -a cols; do
(
IFS=$'\t'
echo "${cols[*]}"
)
done <<EOF
a b c
d e f
g h i
EOF
产生:
a b c
d e f
g h i
(每个标签之间都有一个标签,但是当我将其粘贴到此处时很难看到)
您也可以使用sed
或进行操作tr
,但是请注意,开始时对空白的处理会产生不同的结果。
sed:
$ sed 's/ */\t/g' << EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
tr:
$ tr -s ' ' '\t' <<EOF
a b c
d e f
g h i
EOF
a b c
d e f
g h i
这是一个非常简单的解决方案:
sed -E 's/\s+/\t/g' your_file > new_file
sed基本上以这种方式工作(sed's / old_pattern / new_pattern / g')。在这种情况下,旧模式为“ \ s +”,这意味着查找空间“ s”一个或多个时间“ +”,并使用反斜杠“ \”将其解释为正则表达式。
新模式是制表符“ \ t”,它以正则表达式格式编写,而“ g”则将替换项“全局”应用于所有行。