簡體   English   中英

如何修剪從 bash 標准輸入讀取的行?

[英]How do I trim lines read from standard input on bash?

我想要一種從標准輸入讀取行的 bash 方式(這樣我就可以將輸入通過管道傳輸到它),並只刪除前導和尾隨空格字符。 管道回聲不起作用。

例如,如果輸入是:

     12 s3c  
     sd wqr

輸出應該是:

12 s3c
sd wqr

我想避免為像這樣微不足道的事情編寫 python 腳本或類似的腳本。 任何幫助表示贊賞!

您可以使用 sed 來修剪它。

sed 's/^ *//;s/ *$//'

您可以通過執行以下操作在命令行上輕松測試它:

echo -n "  12 s3c  " | sed 's/^ *//;s/ *$//' && echo c
$ trim () { read -r line; echo "$line"; }
$ echo "   aa   bb   cc   " | trim
aa   bb   cc
$ a=$(echo "   aa   bb   cc   " | trim)
$ echo "..$a.."
..aa   bb   cc..

要使其適用於多行輸入,只需添加一個while循環:

trim () { while read -r line; do echo "$line"; done; }

僅使用sed進行一個替換:

sed 's/^\s*\(.*[^ \t]\)\(\s\+\)*$/\1/'

添加這個:
| sed -r 's/\\s*(.*?)\\s*$/\\1/'

your_command | xargs -L1 echo

這是有效的,因為echo將所有 tabls 轉換為空格,然后將所有多個空格轉換為單個空格,而不僅僅是前導和尾隨,請參見示例:

$ printf "  1\t\t\t2    3"
  1         2    3
$ echo `printf "  1\t\t\t2    3"`
1 2 3

缺點是它還會刪除一些有用的字符,如\\ ' "

我知道這很舊,但還有另一種簡單而骯臟的方法:

line=$(echo $line)

看這個例子:

user@host:~$ x="    abc  "
user@host:~$ echo "+$x+"
+    abc  +
user@host:~$ y=$(echo $x)
user@host:~$ echo "$y"
+abc+
grep -o -E '\S.*\S|\S'

Е解釋:

  • - 只打印匹配項
  • -E - 使用擴展的正則表達式語法
  • '\\S.*\\S' :
    • 匹配第一個非空格符號,然后貪婪匹配任意數量的任何符號,然后匹配一個非空格符號
    • 或者,如果第一部分不匹配(即沒有兩個非空格符號),則匹配單個非空格符號

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM