Mam taki ciąg:
|abcdefg|
I chcę uzyskać nowy ciąg wywoływany w jakiś sposób (np. Ciąg 2) z oryginalnym ciągiem bez dwóch |
znaków na początku i na końcu, aby mieć to:
abcdefg
Czy to możliwe w bash?
Mam taki ciąg:
|abcdefg|
I chcę uzyskać nowy ciąg wywoływany w jakiś sposób (np. Ciąg 2) z oryginalnym ciągiem bez dwóch |
znaków na początku i na końcu, aby mieć to:
abcdefg
Czy to możliwe w bash?
Odpowiedzi:
Możesz to zrobić
string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2
Lub jeśli twoja długość łańcucha jest stała, możesz to zrobić
string="|abcdefg|"
string2=${string:1:7}
echo $string2
To też powinno działać
echo "|abcdefg|" | cut -d "|" -f 2
Także to
echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
awk
rozwiązania. Muszę się nauczyć awk
.
IFS='|' read string2 <<< $string
:)
"${string:1:-1}"
man bash
.
Zejście z kilku wymienionych tutaj postów wydaje się najprostszym sposobem, aby to zrobić:
string="|abcdefg|"
echo ${string:1:-1}
edycja: działa na ubuntu z bash 4.2; nie działa na centOS z bash 4.1
Innym sposobem jest użycie poleceń head
i tail
poleceń:
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
[something something]
z celem wycinania nawiasów, więc echo "[something something]" | tail -c +2 | head -c -2
wypracowałem. Dzięki za wskazówkę!
echo -n "|abcdefg|" | tail -c +2 | head -c -1
. Nie jestem pewien, dlaczego moje zmiany zostały odrzucone ... Szczerze mówiąc, to bardzo smutne. Zobacz man head
więcej informacji
I kolejny:
string="|abcdefg|"
echo "${string//|/}"
Możesz także użyć sed, aby usunąć | nie tylko odwołując się do samego symbolu, ale także używając odniesień pozycyjnych jak w:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
Gdzie „:” są ogranicznikami (możesz je zastąpić / lub dowolnym znakiem spoza zapytania, zrobi to dowolny znak następujący po s) Tutaj ^ (karetka) oznacza na początku ciągu wejściowego, a $ (dolar) oznacza na końcu. The. (punkt), że jest po karetce, a ten, który jest przed znakiem dolara reprezentuje pojedynczy znak. Innymi słowy, usuwamy pierwszy i ostatni znak. Pamiętaj, że spowoduje to usunięcie dowolnych znaków, nawet jeśli | nie jest obecny w ciągu.
DAWNY:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
Trochę bardziej szczegółowe podejście, ale działa na każdym rodzaju pierwszej i ostatniej postaci, nie musi być takie samo. Podstawową ideą jest to, że bierzemy zmienną, odczytujemy ją znak po znaku i dodajemy tylko te, które chcemy do nowej zmiennej
Oto cały ten pomysł sformatowany w przyjemną funkcję
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
}
A oto ta sama funkcja w akcji:
$> crop_string_ends "|abcdefg|"
abcdefg
$> crop_string_ends "HelloWorld"
elloWorl
>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg
lub w wierszu poleceń:
$ 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
Od http://tldp.org/LDP/abs/html/parameter-substitution.html
${var#Pattern}
Usuń z$var
tej najkrótszej części$Pattern
, która odpowiada przód z$var
. Usuń z tej najdłuższej części , która odpowiada tylny koniec z .
${var%%Pattern}
$var
$Pattern
$var
awk -F\| '{ print $2 }' <<<"|string|"