使用grep显示字符串中的第二个字符?

Mr.*_*ndo 4 grep awk command-line

我有一个总是 3 个字符的字符串......第一个和最后一个总是相同的。

例子:

???

有没有一种简单的方法只显示中间的那个?(这是唯一改变的)

Gil*_*not 11

是的,尝试这样做,然后选择您喜欢的方法 =) :

使用

echo "ixi" | grep -oP "^.\K."
Run Code Online (Sandbox Code Playgroud)

echo "ixi" | cut -c2
Run Code Online (Sandbox Code Playgroud)

使用 参数扩展

x='ixi'; echo ${x:1:1}
Run Code Online (Sandbox Code Playgroud)

使用

echo "ixi" | sed 's/.\(.\)./\1/'
Run Code Online (Sandbox Code Playgroud)

或者

echo "ixi" | sed 's/\(^.\|.$\)//g'
Run Code Online (Sandbox Code Playgroud)

使用

echo "ixi" | perl -lne 'print $& if /^.\K./'
Run Code Online (Sandbox Code Playgroud)

echo "ixi" | ruby -ne 'print $_.split(//)[1]'
Run Code Online (Sandbox Code Playgroud)

使用

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

使用

echo "ixi" | python -c 'print list("'$(cat)'")[1]'
Run Code Online (Sandbox Code Playgroud)

或者

python -c 'import sys; print list(sys.argv[1])[1]' ixi
Run Code Online (Sandbox Code Playgroud)

笔记

  • \K将匹配重新开始为零(参见pcre文档)
  • $(cat) 在 python 中是一个 shell hack 来获取 STDIN

  • +1 很好地使用了`grep`。 (3认同)
  • 添加了最排序的一个:`cut` (3认同)

Dav*_*vis 5

您也可以使用sed代替grep

sed 's/.\(.\)./\1/'
Run Code Online (Sandbox Code Playgroud)

这说:

  1. s/... 匹配表达式到下一个/字符。
  2. . ...匹配第一个字符(任何)。
  3. \(.\) ...匹配下一个字符并记住它。
  4. . ...匹配第三个字符(任何)。
  5. / ...表示表达式的结束。
  6. \1 ...替换与记住的字符匹配的整个字符串。
  7. / ... 替换文本结束。

因此:

$ echo "abc" | sed 's/.\(.\)./\1/'
Run Code Online (Sandbox Code Playgroud)

将打印:

b
Run Code Online (Sandbox Code Playgroud)