如何用一個製表符取代多個空格

如何用一個製表符取代多個空格

我有一些文字文件,其中包含一些由不同數量的空格分隔的列,但我需要一個選項卡作為分隔符號。在 Bash 中可以做嗎?

答案1

轉換序列多個空間到一個選項卡,但是留下單獨的空間:

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' {} \;

對於 MacOS 使用此形式(或只是為了避免+在 Linux 中轉義):

sed -E 's/ + /\t/g'

以及您從上面的範例中需要的其他選項等。

答案2

如果您的角色有多個選項卡,您也可以使用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 " "

所有的空白都將合而為一。

答案3

您可以使用sed製表符替換多個空格:

用一個製表符取代一個或多個空格的範例:

cat spaced-file | sed 's/ \+/\t/g' > tabbed-file

答案4

只使用最簡單的答案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

相關內容