Видаліть останній символ із рядка


54

Я хочу видалити останній символ із рядка:

[root@ozzesh ~]#df -h | awk  '{ print $5 }'
Use%
22%
1%
1%
59%
51%
63%
5%

Очікуваний результат:

Use
22
1
1
59
51
63
5

2
Це завжди %знак?
Бернхард

Відповіді:


83
sed 's/.$//'

Щоб видалити останній символ.

Але в цьому конкретному випадку ви також можете зробити:

df -P | awk 'NR > 1 {print $5+0}'

За допомогою арифметичного виразу ( $5+0) ми змушуємо awkінтерпретувати 5-е поле як число, і все після числа буде ігноровано.

Зауважте, що GNU df(ваше -hвже є розширенням GNU, хоч тут і не потрібно) можна також сказати, щоб виводити лише відсоток використання диска:

df --output=pcent | tail -n +2 | tr -cd '0-9\n'

(хвіст пропускає заголовки, а tr видаляє все, крім цифр та обмежувачів рядків).

Про Linux див. Також:

findmnt -no USE%

9
{print +$5}буде також працювати ...
jasonwryan

1
@jasonwryan, на жаль, існує багато awkреалізацій, де це не працює , де +одинарний оператор просто ігнорується і не примушує перетворення рядків у числові.
Стефан Шазелас

20

З sed, це досить просто:

$ cat file
Use%
22%
1%
1%
59%
51%
63%
5%
$ sed 's/.$//' file
Use
22
1
1
59
51
63
5

Синтаксис є s(ubstitute)/search/replacestring/. .Вказує будь-який символ, а $кінець лінії. Так .$буде видалено лише останній символ.

У цьому випадку ваша повна команда виглядатиме:

df -h | awk '{ print $5}' | sed 's/.$//'

2
Труба до sedзайвих: це можна зробити в awk:df -h | awk '{gsub(/%/,""); print $5}'
Jasonwryan

@jasonwryan Тоді мені більше подобається рішення Стефана.
Бернхард

15

У мене є два рішення:

  1. вирізати: echo "somestring1" | rev | cut -c 2- | rev

    Тут ви перевертаєте рядок і вирізаєте рядок з другого символу та знову повертаєте назад.

  2. sed: echo "somestring1" | sed 's/.$//'

    Тут ви будете шукати регулярний вираз, .$який означає, що будь-які символи, за якими слідує останній символ, і замініть його на null //(між двома косою рисою)



2

інший підхід:

mapfile -t list < <(df -h)
printf '%s\n' "${list[@]%?}"

Перетворіть його на функцію:

remove_last() {
  local char=${1:-?}; shift
  mapfile -t list < <("$@")
  printf '%s\n' "${list[@]%$char}"
}

Тоді назвіть це так:

remove_last '%' df -h

mapfile є функцією bash4.

Привід тут полягає в тому, що ви повинні поставити персонаж, який потрібно видалити; якщо ви хочете, щоб це було просто будь- яким останнім символом, тоді ви повинні пройти '?'або ''. необхідні котирування.



1

Спробуйте з цим:

df -h | awk  '{ print $5 }' | sed "s/%//"

Нормальне використання: (тобто)

VALUE=987654321
echo X123456789X | sed "s/123456789/${VALUE}/"

Відповідь має бути: X987654321X


1
df -h | awk 'NR > 1{ print $5 }' | cut -d "%" -f1

Ця відповідь може бути кориснішою іншим за межами ОП, якщо ви можете дати трохи пояснень щодо того, як це працює, і, можливо, чому це може бути краще, ніж альтернативи
Fox,

Ласкаво просимо в Unix Stackexchange! Ви можете взяти тур, щоб відчути, як працює цей сайт. Даючи відповідь, бажано дати пояснення щодо того, ЧОМУ ваша відповідь потрібна читачеві. Це означає, що найкраще, якщо ви дасте трохи пояснень, як це працює. Якщо ви подивитесь вище, ви побачите, що всі голосовані відповіді пояснюють код.
Стівен Рауч

Запропоновано cut -d '%' -f1правильну відповідь, щоб все було в рядку до першого "%".
Тіту

Плюс я вважаю, що лише шкідливі / неправильні відповіді повинні колись знижуватись нижче 0.
Titou

0
sed -ie '$d' filename

here -i is to write changes
      e means expression
      $ means last line
      d means delete

Note:Without -e option $ wont work

Необов’язково : Для видалення першого та останнього рядка використовуйте sed -ie '1d;$d'ім’я файлу


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.