У мене є такий рядок:
|abcdefg|
І я хочу отримати нову рядок, який називається якось (наприклад, string2) з початковою рядком без двох |
символів на початку та в кінці її, щоб у мене було таке:
abcdefg
Це можливо в баш?
У мене є такий рядок:
|abcdefg|
І я хочу отримати нову рядок, який називається якось (наприклад, string2) з початковою рядком без двох |
символів на початку та в кінці її, щоб у мене було таке:
abcdefg
Це можливо в баш?
Відповіді:
Ви можете зробити
string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2
Або якщо довжина вашої струни є постійною, ви можете це зробити
string="|abcdefg|"
string2=${string:1:7}
echo $string2
Також це має спрацювати
echo "|abcdefg|" | cut -d "|" -f 2
Також це
echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
awk
рішення. Мені потрібно вчитися awk
.
IFS='|' read string2 <<< $string
:)
"${string:1:-1}"
man bash
.
Виходячи з кількох перелічених тут публікацій, здається, найпростіший спосіб це зробити:
string="|abcdefg|"
echo ${string:1:-1}
редагувати: працює на ubuntu з bash 4.2; не працює на centOS з bash 4.1
Інший спосіб - використання head
& tail
команд:
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
[something something]
з метою вирізати дужки, так що echo "[something something]" | tail -c +2 | head -c -2
вийшло. Дякую за пораду!
echo -n "|abcdefg|" | tail -c +2 | head -c -1
. Я не впевнений, чому мене відхилили правки ... Чесно кажучи. Дивіться man head
для отримання додаткової інформації
І ще один:
string="|abcdefg|"
echo "${string//|/}"
Ви також можете використовувати sed для видалення | не просто посилання на сам символ, а використання позиційних посилань, як у:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
Де ':' є роздільниками (ви можете замінити їх на / або будь-який символ, який не знаходиться у запиті; будь-який знак, що відповідає s, це зробить) Тут ^ (caret) означає на початку рядка введення, а $ (долар) означає в кінці. The. (пункт), що це після карети і того, що це перед знаком долара, являє собою єдиний символ. Отже іншими словами ми видаляємо перший та останній символи. Пам'ятайте, що це видалить будь-які символи, навіть якщо | його немає в рядку.
EX:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
Трохи докладніший підхід, але працює над будь-яким першим і останнім персонажем, не повинен бути однаковим. Основна ідея полягає в тому, що ми беремо змінну, читаємо її за символом та додаємо до нової змінної лише ті, що ми хочемо
Ось ця вся ідея відформатована у приємну функцію
crop_string_ends() {
STR="$1"
NEWSTR=""
COUNT=0
while read -n 1 CHAR
do
COUNT=$(($COUNT+1))
if [ $COUNT -eq 1 ] || [ $COUNT -eq ${#STR} ]
then
continue
fi
NEWSTR="$NEWSTR"$CHAR
done <<<"$STR"
echo $NEWSTR
}
А ось та сама функція в дії:
$> crop_string_ends "|abcdefg|"
abcdefg
$> crop_string_ends "HelloWorld"
elloWorl
>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg
або в командному рядку:
$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"
abcdefg
$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'
abcdefg
$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"
abcdefg
$ string="|abcdefg|"
$ string="${string#?}" && string="${string%%?}"
$ echo "$string"
abcdefg
З http://tldp.org/LDP/abs/html/parameter-substitution.html
${var#Pattern}
Видалити з$var
по найкоротшим частинам ,$Pattern
яка відповідає переднього кінця з$var
. Видалити з по довгій частині , яка відповідає задній частині з .
${var%%Pattern}
$var
$Pattern
$var
awk -F\| '{ print $2 }' <<<"|string|"