web-dev-qa-db-ja.com

bashの標準入力から読み取った行をトリミングするにはどうすればよいですか?

標準入力から行を読み取るbashの方法(パイプ入力で入力できるようにする)を行い、先頭と末尾のスペース文字だけを削除します。エコーする配管が機能しない。

たとえば、入力が次の場合:

     12 s3c  
     sd wqr

出力は次のようになります。

12 s3c
sd wqr

pythonスクリプトなどを、これと同じくらい簡単なもので書くことは避けたいです。どんな助けでもありがたいです!

24
donatello

Sedを使用してトリミングできます。

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

あなたはそれをコマンドラインで本当に簡単にテストすることができます:

echo -n "  12 s3c  " | sed 's/^ *//;s/ *$//' && echo c
28
phillip
$ 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; }

one置換のみでsedを使用:

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

これを追加:
| sed -r 's/\s*(.*?)\s*$/\1/'

4
Nakilon

私はこれが古いことを知っていますが、別の単純で汚い方法があります:

line=$(echo $line)

この例を見てください:

user@Host:~$ x="    abc  "
user@Host:~$ echo "+$x+"
+    abc  +
user@Host:~$ y=$(echo $x)
user@Host:~$ echo "$y"
+abc+
2
Akira
your_command | xargs -L1 echo

これが機能するのは、echoがすべてのタブをスペースに変換してから、先頭と末尾だけでなく、すべての複数のスペースを1つのスペースに変換するためです。例を参照してください。

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

欠点は、\'"などの便利な文字も削除されることです。

2
exebook