題 使用grep在字符串中顯示第二個字符?


我有一個總是3個字符的字符串...第一個和最後一個總是相同的。

例:

▁▅█

有沒有一種簡單的方法只顯示中間的那個? (這是唯一改變的)


4
2017-11-15 16:58


起源




答案:


是的,嘗試這樣做,然後選擇你喜歡的方法=):

echo "ixi" | grep -oP "^.\K."

echo "ixi" | cut -c2

  參數擴展 :

x='ixi'; echo ${x:1:1}

echo "ixi" | sed 's/.\(.\)./\1/'

要么

echo "ixi" | sed 's/\(^.\|.$\)//g'

echo "ixi" | perl -lne 'print $& if /^.\K./'

echo "ixi" | ruby -ne 'print $_.split(//)[1]'

echo 'ixi' | awk '{split($0, a, ""); print a[2]}'

echo "ixi" | python -c 'print list("'$(cat)'")[1]'

要么

python -c 'import sys; print list(sys.argv[1])[1]' ixi

注意

  • \K 將匹配重新啟動為零(請參閱 pcre DOC)
  • $(cat) 在python中是一個shell hack得到 STDIN

8
2017-11-15 17:09



+1很好用 grep。 - Dave Jarvis
添加了sortest: cut - Gilles Quenot
喜歡那個grep - Mr.Gando


你也可以使用 sed 代替 grep

sed 's/.\(.\)./\1/'

這說:

  1. s/ ...將表達式匹配到下一個 / 字符。
  2. . ...匹配第一個字符(任意)。
  3. \(.\) ...匹配下一個角色並記住它。
  4. . ...匹配第三個字符(任意)。
  5. / ...表示表達式的結尾。
  6. \1 ...替換與記住的字符匹配的整個字符串。
  7. / ...替換文本的結尾。

從而:

$ echo "abc" | sed 's/.\(.\)./\1/'

將打印:

b

5
2017-11-15 17:05






要么

echo "ixi" | awk '{print substr($0,2,1)}'

要么

expr "ixi" : '.\(.\).'

1
2017-11-15 18:14





對於多樣性,這是一種方式 dd

echo ixi | dd bs=1 skip=1 count=1 2>/dev/null

如果你的grep不支持perl(-P),你可以這樣做:

echo ixi | grep -o . | sed -n 2p

這些替代方案僅適用於單線輸入。


1
2017-11-16 08:38