提取两个字符之间的单词,使用sed/grep。

huangapple go评论81阅读模式
英文:

sed/grep to extract word between 2 characters

问题

I want to print lmn.

  1. ~$ echo abcde^10=fgi^11=jkl^12=lmn|grep -o '^12=[^)]*\^'
  1. ~$ echo abcde^11=jkl^12=lmn^10=fgi|grep -o '^12=[^)]*\^'
  1. ~$ echo 12=lmn^11=jkl^10=fgi^abcde|grep -o '12=lmn^'
英文:

My sentence is

  1. abcde^10=fgi^11=jkl^12=lmn

The sequence can be jumbled also
for eg.

  1. abcde^11=jkl^12=lmn^10=fgi

The sequence can also be :

  1. 12=lmn^11=jkl^10=fgi^abcde

I want to print lmn.

I have gotten till thus far:

  1. ~$ echo abcde^10=fgi^11=jkl^12=lmn|grep -o '\^12=[^)]*\^' -> this doesnt print anything
  1. ~$ echo abcde^11=jkl^12=lmn^10=fgi|grep -o '\^12=[^)]*\^' -> this prints ^12=lmn^

答案1

得分: 2

With GNU awk for multi-char RS:

  1. $ echo 'abcde^10=fgi^11=jkl^12=lmn' | awk -v RS='[\n^]' -F'=' '$1==12{print $2}'
  2. lmn
  3. $ echo '12=lmn^11=jkl^10=fgi^abcde' | awk -v RS='[\n^]' -F'=' '$1==12{print $2}'
  4. lmn

or using any awk:

  1. $ echo 'abcde^10=fgi^11=jkl^12=lmn' | awk -v RS='^' -F'[=\n]' '$1==12{print $2}'
  2. lmn
  3. $ echo 'abcde^10=fgi^11=jkl^12=lmn' | awk -v RS='^' -F'[=\n]' '$1==12{print $2}'
  4. lmn
英文:

With GNU awk for multi-char RS:

  1. $ echo 'abcde^10=fgi^11=jkl^12=lmn' | awk -v RS='[\n^]' -F'=' '$1==12{print $2}'
  2. lmn
  3. $ echo '12=lmn^11=jkl^10=fgi^abcde' | awk -v RS='[\n^]' -F'=' '$1==12{print $2}'
  4. lmn

or using any awk:

  1. $ echo 'abcde^10=fgi^11=jkl^12=lmn' | awk -v RS='^' -F'[=\n]' '$1==12{print $2}'
  2. lmn

<p>

  1. $ echo &#39;abcde^10=fgi^11=jkl^12=lmn&#39; | awk -v RS=&#39;^&#39; -F&#39;[=\n]&#39; &#39;$1==12{print $2}&#39;
  2. lmn

答案2

得分: 1

使用在GNU awk中显示的示例,您可以在awkwhile循环中使用正则表达式(^|\^)12=([^^]*)match函数。

  1. {
  2. while(match($0,/(^|\^)12=([^^]*)/,arr)){
  3. print arr[2]
  4. $0=substr($0,RSTART+RLENGTH)
  5. }
  6. }
英文:

With your shown samples in GNU awk, you can use match function of awk with regex (^|\^)12=([^^]*) in while loop.

  1. awk &#39;
  2. {
  3. while(match($0,/(^|\^)12=([^^]*)/,arr)){
  4. print arr[2]
  5. $0=substr($0,RSTART+RLENGTH)
  6. }
  7. }
  8. &#39; Input_file

答案3

得分: 0

  1. 如果您想提取第一个`12=`和下一个`^`或字符串末尾(不确定)之间的部分,无需外部工具。 `bash` 替换就足够了:

s='abcde^10=fgi^11=jkl^12=lmn'
s="${s#12=}";echo "${s%%^}"

  1. 或者:

[[ "abcde^10=fgi^11=jkl^12=lmn" =~ .12=([^^]).* ]] && echo "${BASH_REMATCH[1]}"

  1. 但如果您喜欢`sed`

sed 's/.12=([^^]).*/\1/' <<< 'abcde^10=fgi^11=jkl^12=lmn'

  1. <details>
  2. <summary>英文:</summary>
  3. If you want to extract the part between the first `12=` and the next `^` or the end of the string (not sure of that) you don&#39;t need external utilities. `bash` substitutions are enough:

s='abcde^10=fgi^11=jkl^12=lmn'
s="${s#12=}"; echo "${s%%^}"

  1. Or:

[[ "abcde^10=fgi^11=jkl^12=lmn" =~ .12=([^^]).* ]] && echo "${BASH_REMATCH[1]}"

  1. But if you prefer `sed`:

sed 's/.12=([^^]).*/\1/' <<< 'abcde^10=fgi^11=jkl^12=lmn'

  1. </details>
  2. # 答案4
  3. **得分**: 0
  4. 使用正向后视断言的grep(仅打印匹配项)

grep -Po '(?<=12=)[^^]+'

  1. 使用sed(完全打印没有匹配的行)

sed -E 's/(^|.^)12=([^^]+)./\2/'

  1. <details>
  2. <summary>英文:</summary>
  3. With grep using positive lookbehinds (prints only matches)
  4. grep -Po &#39;(?&lt;=12=)[^^]+&#39;
  5. With sed (prints lines wihtout matches entirely)
  6. sed -E &#39;s/(^|.*\^)12=([^^]+).*//&#39;
  7. </details>
  8. # 答案5
  9. **得分**: 0
  10. echo &#39;
  11. abcde^10=fgi^11=jkl^12=lmn
  12. abcde^11=jkl^12=lmn^10=fgi
  13. 12=lmn^11=jkl^10=fgi^abcde&#39; |
  14. nawk &#39;gsub(/.*12=|\^.+/,_)^_&#39;
  15. &gt;
  16. gawk &#39;$_=$2&#39; FS=&#39;.*12=|\\^.+&#39;
  17. &gt;
  18. mawk ++NF OFS= FS=&#39;.*12=|\^.+&#39;
  19. lmn
  20. lmn
  21. lmn
  22. <details>
  23. <summary>英文:</summary>
  24. you mean like this ?
  25. echo &#39;
  26. abcde^10=fgi^11=jkl^12=lmn
  27. abcde^11=jkl^12=lmn^10=fgi
  28. 12=lmn^11=jkl^10=fgi^abcde&#39; |
  29. ---
  30. nawk &#39;gsub(/.*12=|\^.+/,_)^_&#39;
  31. &gt;
  32. gawk &#39;$_=$2&#39; FS=&#39;.*12=|\\^.+&#39;
  33. &gt;
  34. mawk ++NF OFS= FS=&#39;.*12=|\^.+&#39;
  35. ---
  36. lmn
  37. lmn
  38. lmn
  39. </details>
  40. # 答案6
  41. **得分**: 0
  42. lmn
  43. lmn
  44. lmn
  45. <details>
  46. <summary>英文:</summary>
  47. $ echo &#39;abcde^10=fgi^11=jkl^12=lmn
  48. abcde^11=jkl^12=lmn^10=fgi
  49. 12=lmn^11=jkl^10=fgi^abcde
  50. &#39; | awk -F&#39;(^|\\^)12=&#39; &#39;NF&gt;1{sub(/\^.*/,&quot;&quot;,$NF); print $NF}&#39;
  51. lmn
  52. lmn
  53. lmn
  54. </details>

huangapple
  • 本文由 发表于 2023年8月9日 14:12:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/76865021-2.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定