Tôi có một chuỗi như thế:
|abcdefg|
Và tôi muốn có được một chuỗi mới được gọi bằng cách nào đó (như chuỗi2) với chuỗi gốc không có hai |
ký tự ở đầu và ở cuối chuỗi để tôi sẽ có chuỗi này:
abcdefg
Điều đó có thể trong bash không?
Tôi có một chuỗi như thế:
|abcdefg|
Và tôi muốn có được một chuỗi mới được gọi bằng cách nào đó (như chuỗi2) với chuỗi gốc không có hai |
ký tự ở đầu và ở cuối chuỗi để tôi sẽ có chuỗi này:
abcdefg
Điều đó có thể trong bash không?
Câu trả lời:
Bạn có thể làm
string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2
Hoặc nếu độ dài chuỗi của bạn không đổi, bạn có thể làm
string="|abcdefg|"
string2=${string:1:7}
echo $string2
Ngoài ra, điều này sẽ làm việc
echo "|abcdefg|" | cut -d "|" -f 2
Ngoài ra cái này
echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
awk
giải pháp tuyệt vời . Tôi cần học hỏi awk
.
IFS='|' read string2 <<< $string
:)
"${string:1:-1}"
man bash
.
Tắt một vài bài viết được liệt kê ở đây có vẻ như cách đơn giản nhất để làm điều đó là:
string="|abcdefg|"
echo ${string:1:-1}
chỉnh sửa: hoạt động trên Ubuntu với bash 4.2; không hoạt động trên centOS với bash 4.1
Một cách khác là sử dụng head
& tail
lệnh:
$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
[something something]
với một mục tiêu để cắt ngoặc, vì vậy echo "[something something]" | tail -c +2 | head -c -2
đã làm việc ra. Cảm ơn vì một lời khuyên!
echo -n "|abcdefg|" | tail -c +2 | head -c -1
. Tôi không chắc tại sao các chỉnh sửa của mình bị từ chối ... Thật đáng buồn, thành thật mà nói. Xem man head
để biết thêm thông tin
Và một số khác:
string="|abcdefg|"
echo "${string//|/}"
Bạn cũng có thể sử dụng sed để loại bỏ | không chỉ tham chiếu biểu tượng mà còn sử dụng các tham chiếu vị trí như trong:
$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
Trong đó ':' là các dấu phân cách (bạn có thể thay thế chúng bằng / hoặc bất kỳ ký tự nào không có trong truy vấn, bất kỳ dấu hiệu nào sau s sẽ làm điều đó) Ở đây ^ (caret) có nghĩa là ở đầu chuỗi đầu vào và $ (đô la) có nghĩa là cuối cùng. Các . (điểm) rằng nó nằm sau dấu mũ và cái trước ký hiệu đô la đại diện cho một ký tự. Vì vậy, nói cách khác, chúng tôi đang xóa các ký tự đầu tiên và cuối cùng. Hãy nhớ rằng điều này sẽ xóa bất kỳ ký tự ngay cả khi | nó không có trong chuỗi.
VÍ DỤ:
$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
Một cách tiếp cận dài dòng hơn một chút, nhưng hoạt động trên bất kỳ loại ký tự đầu tiên và cuối cùng, không nhất thiết phải giống nhau. Ý tưởng cơ bản là chúng ta đang lấy một biến, đọc ký tự theo từng ký tự và chỉ nối thêm những biến chúng ta muốn vào một biến mới
Đây là toàn bộ ý tưởng được định dạng thành một chức năng tốt
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
}
Và đây là chức năng tương tự trong hành động:
$> crop_string_ends "|abcdefg|"
abcdefg
$> crop_string_ends "HelloWorld"
elloWorl
>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg
hoặc trên dòng lệnh:
$ 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
Từ http://tldp.org/LDP/abs/html/parameter-substlation.html
${var#Pattern}
Di chuyển từ$var
các ngắn nhất một phần của$Pattern
điều đó phù hợp với kết thúc trước của$var
. Xoá khỏi sự dài nhất là một phần của điều đó phù hợp với back-end của .
${var%%Pattern}
$var
$Pattern
$var
awk -F\| '{ print $2 }' <<<"|string|"