Ответ 1
Вы можете использовать sed, чтобы обрезать его.
sed 's/^ *//;s/ *$//'
Вы можете легко протестировать его в командной строке, выполнив следующие действия:
echo -n " 12 s3c " | sed 's/^ *//;s/ *$//' && echo c
Мне нужен способ bash для чтения строк со стандартного ввода (поэтому я могу подключить к нему вход) и удалить только символы верхнего и конечного пробелов. Трубопровод для эха не работает.
Например, если вход:
12 s3c
sd wqr
вывод должен быть:
12 s3c
sd wqr
Я хочу избежать написания python script или подобного для чего-то столь же тривиального, как это. Любая помощь приветствуется!
Вы можете использовать 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/'
Я знаю, что это старо, но есть еще один простой и грязный способ:
line=$(echo $line)
См. этот пример:
[email protected]:~$ x=" abc "
[email protected]:~$ echo "+$x+"
+ abc +
[email protected]:~$ y=$(echo $x)
[email protected]:~$ echo "$y"
+abc+
your_command | xargs -L1 echo
Это работает, потому что echo
преобразует все табуляции в пробелы, а затем все несколько пробелов в одно пространство, а не только начало и конец, см. пример:
$ printf " 1\t\t\t2 3"
1 2 3
$ echo `printf " 1\t\t\t2 3"`
1 2 3
Недостатком является то, что он также удалит некоторые полезные символы, такие как \
'
"
.