如何用一个标签替换多个空格


26

我有一些文本文件,其中包含以不同数量的空格分隔的某些列,但我需要一个标签作为分隔符。在Bash中可以做吗?


感谢您的大力投入,但我在列中有一些空格,因此我必须避免使用制表符。抱歉,该信息是。
user_unknown

Answers:


29

要将多个空格的序列转换为制表符,但不保留单个空格

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: `.'
亚伦·弗兰克

@AaronFranke:您尝试了什么命令?我的答案中的所有示例均不应产生该错误。
丹尼斯威廉姆森

抱歉,我应该澄清一下。在find底部之一。
亚伦弗兰克

@AaronFranke:GNU sed不喜欢在备份扩展名前留空格。我已经编辑了答案。感谢您的报告。
丹尼斯·威廉姆森

6

如果您的角色是多个标签,则还可以使用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 " "

所有空白将成为一个。


这不是OP所要求的。
罗恩·约翰(RonJohn)


3

仅使用的最简单答案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


2

尝试以下SED脚本:

 sed 's/  */<TAB>/g' <spaces-file > tabs-file

<TAB>按下TAB键的位置。


0

这是一个非常简单的解决方案:

    sed -E 's/\s+/\t/g' your_file > new_file

sed基本上以这种方式工作(sed's / old_pattern / new_pattern / g')。在这种情况下,旧模式为“ \ s +”,这意味着查找空间“ s”一个或多个时间“ +”,并使用反斜杠“ \”将其解释为正则表达式。
新模式是制表符“ \ t”,它以正则表达式格式编写,而“ g”则将替换项“全局”应用于所有行。


1
您好,欢迎来到超级用户。您应该花时间解释您的解决方案。对于不熟悉* nix系统,sed和正则表达式的人来说,这看起来像一堆奇怪的字符。
Mogget
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.