it-swarm-id.com

Bagaimana cara memotong spasi putih memimpin dan tertinggal dari setiap baris dari beberapa output?

Saya ingin menghapus semua spasi dan tab depan dan belakang dari setiap baris dalam output.

Apakah ada alat sederhana seperti trim Saya dapat menyalurkan output saya ke?

File contoh:

test space at back 
 test space at front
TAB at end  
    TAB at front
sequence of some    space in the middle
some empty lines with differing TABS and spaces:





 test space at both ends 
189
rubo77
awk '{$1=$1;print}'

atau lebih pendek:

awk '{$1=$1};1'

Akan memangkas karakter spasi atau tab terkemuka dan tertinggal1 dan juga memeras urutan tab dan spasi menjadi satu ruang.

Itu bekerja karena ketika Anda menetapkan sesuatu ke salah satu bidang, awk membangun kembali seluruh catatan (seperti yang dicetak oleh print) dengan bergabung dengan semua bidang ($1, ..., $NF) dengan OFS (spasi secara default).

1(dan mungkin karakter kosong lainnya tergantung pada lokal dan implementasi awk)

242

Perintah dapat diringkas seperti itu jika Anda menggunakan GNU sed:

$ sed 's/^[ \t]*//;s/[ \t]*$//' < file

Contoh

Inilah perintah di atas dalam aksi.

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
blahblah

Anda dapat menggunakan hexdump untuk mengonfirmasi bahwa perintah sed menghapus karakter yang diinginkan dengan benar.

$ echo -e " \t   blahblah  \t  " | sed 's/^[ \t]*//;s/[ \t]*$//' | hexdump -C
00000000  62 6c 61 68 62 6c 61 68  0a                       |blahblah.|
00000009

Kelas karakter

Anda juga dapat menggunakan nama kelas karakter alih-alih mendaftar set seperti ini, [ \t]:

$ sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' < file

Contoh

$ echo -e " \t   blahblah  \t  " | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'

Sebagian besar alat GNU yang menggunakan ekspresi reguler (regex) mendukung kelas-kelas ini.

 [[:alnum:]]  - [A-Za-z0-9]     Alphanumeric characters
 [[:alpha:]]  - [A-Za-z]        Alphabetic characters
 [[:blank:]]  - [ \x09]         Space or tab characters only
 [[:cntrl:]]  - [\x00-\x19\x7F] Control characters
 [[:digit:]]  - [0-9]           Numeric characters
 [[:graph:]]  - [!-~]           Printable and visible characters
 [[:lower:]]  - [a-z]           Lower-case alphabetic characters
 [[:print:]]  - [ -~]           Printable (non-Control) characters
 [[:punct:]]  - [!-/:[email protected][-`{-~]  Punctuation characters
 [[:space:]]  - [ \t\v\f]       All whitespace chars
 [[:upper:]]  - [A-Z]           Upper-case alphabetic characters
 [[:xdigit:]] - [0-9a-fA-F]     Hexadecimal digit characters

Menggunakan ini bukannya set literal selalu tampak seperti buang-buang ruang, tetapi jika Anda khawatir dengan kode Anda menjadi portabel, atau harus berurusan dengan set karakter alternatif (pikirkan internasional), maka Anda mungkin ingin menggunakan nama kelas sebagai gantinya.

Referensi

57
slm

xargs tanpa argumen melakukannya.

Contoh:

trimmed_string=$(echo "no_trimmed_string" | xargs) 
27
Newton_Jose

Seperti yang disarankan oleh Stéphane Chazelas dalam jawaban yang diterima, Anda sekarang bisa
buat skrip /usr/local/bin/trim:

#!/bin/bash
awk '{$1=$1};1'

dan berikan file itu hak yang dapat dieksekusi:

chmod +x /usr/local/bin/trim

Sekarang Anda dapat meneruskan setiap output ke trim misalnya:

cat file | trim

(untuk komentar di bawah ini: saya menggunakan ini sebelumnya: while read i; do echo "$i"; done
yang juga berfungsi dengan baik, tetapi kurang performan)

25
rubo77
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'

Jika Anda membaca baris ke dalam variabel Shell, read sudah melakukannya kecuali diperintahkan sebaliknya .

Jika Anda menyimpan baris sebagai variabel, Anda dapat menggunakan bash untuk melakukan pekerjaan:

hapus spasi putih terkemuka dari string:

shopt -s extglob
echo ${text##+([[:space:]])}

hapus spasi spasi tambahan dari string:

shopt -s extglob
echo ${text%%+([[:space:]])}

hapus semua spasi putih dari string:

echo ${text//[[:space:]]}
17
Łukasz Rajchel

Untuk menghapus semua spasi awal dan akhir dari garis tertentu berkat alat 'piped', saya dapat mengidentifikasi 3 cara berbeda yang tidak sepenuhnya setara. Perbedaan-perbedaan ini menyangkut ruang antara kata-kata dari garis input. Bergantung pada perilaku yang diharapkan, Anda akan menentukan pilihan.

Contohnya

Untuk menjelaskan perbedaannya, mari pertimbangkan jalur input dummy ini:

"   \t  A   \tB\tC   \t  "

tr

$ echo -e "   \t  A   \tB\tC   \t  " | tr -d "[:blank:]"
ABC

tr benar-benar perintah sederhana. Dalam hal ini, ia menghapus spasi atau karakter tabulasi.

awk

$ echo -e "   \t  A   \tB\tC   \t  " | awk '{$1=$1};1'
A B C

awk menghapus spasi terdepan dan tailing dan diperas ke satu spasi setiap spasi di antara kata-kata.

sed

$ echo -e "   \t  A   \tB\tC   \t  " | sed 's/^[ \t]*//;s/[ \t]*$//'
A       B   C

Dalam kasus ini, sed menghapus spasi awal dan tailing tanpa menyentuh spasi di antara kata-kata.

Keterangan:

Dalam hal satu kata per baris, tr melakukan pekerjaan.

15
frozar

sed adalah alat yang bagus untuk itu:

                        # substitute ("s/")
sed 's/^[[:blank:]]*//; # parts of lines that start ("^")  with a space/tab 
     s/[[:blank:]]*$//' # or end ("$") with a space/tab
                        # with nothing (/)

Anda dapat menggunakannya untuk kasing dalam teks, mis.

<file sed -e 's/^[[...

atau dengan bertindak di atasnya 'sebaris' jika sed Anda adalah GNU satu:

sed -i 's/...' file

tetapi mengubah sumber dengan cara ini "berbahaya" karena mungkin tidak dapat dipulihkan ketika tidak berfungsi dengan benar (atau bahkan ketika itu benar!), jadi buat cadangan terlebih dahulu (atau gunakan -i.bak yang juga bermanfaat untuk dibawa-bawa ke beberapa BSD seds)!

6
Michael Durrant

Sekilas jawaban yang bisa Anda pahami:

#!/usr/bin/env python3
import sys
for line in sys.stdin: print(line.strip()) 

Bonus: ganti str.strip([chars]) dengan karakter sewenang-wenang untuk memotong atau menggunakan .lstrip() atau .rstrip() sesuai kebutuhan.

Seperti jawaban rubo77 , simpan sebagai skrip /usr/local/bin/trim Dan berikan izin dengan chmod +x.

4
qwr

perintah menerjemahkan akan bekerja

cat file | tr -d [:blank:]
2
Srinagesh

Saya menulis fungsi Shell ini menggunakan awk

awkcliptor(){
    awk -e 'BEGIN{ RS="^$" } {gsub(/^[\n\t ]*|[\n\t ]*$/,"");print ;exit}' "$1" ; } 

BEGIN{ RS="^$" }:
di awal sebelum memulai parsing catatan yang ditetapkan
pemisah untuk tidak ada yang memperlakukan seluruh input sebagai
satu rekaman

gsub(this,that):
gantikan regexp ini dengan string itu

/^[\n\t ]*|[\n\t ]*$/:
dari string tersebut menangkap ruang kelas dan kelas tab pre baru
atau poskan ruang baris baru dan kelas tab dan ganti dengan
string kosong

print;exit: Lalu cetak dan keluar

"$1":
dan berikan argumen pertama dari fungsi tersebut
diproses oleh awk

cara Penggunaan:
salin kode di atas, tempel di Shell, lalu masukkan ke
mendefinisikan fungsi.
maka Anda dapat menggunakan awkcliptor sebagai perintah dengan argumen pertama sebagai file input

penggunaan sampel:

echo '
 ggggg    

      ' > a_file
awkcliptor a_file

keluaran:

ggggg

atau

echo -e "\n ggggg    \n\n      "|awkcliptor 

keluaran:

ggggg
1

Jika string yang hendak dipotong pendek dan kontinu/berdekatan, seseorang dapat dengan mudah memberikannya sebagai parameter untuk fungsi bash:

    trim(){
        echo [email protected]
    }

    a="     some random string   "

    echo ">>`trim $a`<<"
Output
>>some random string<<
1
Subrata Das
trimpy () {
    python3 -c 'import sys
for line in sys.stdin: print(line.strip())'
}
trimsed () {
gsed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}
# example usage
echo " hi " | trimpy

Bonus: ganti str.strip([chars]) dengan karakter acak untuk memotong atau menggunakan .lstrip() atau .rstrip() sesuai kebutuhan.

(Ini hanyalah remix dari jawaban lain di sini.)

0
HappyFace