sed:努力用^ * =进行替换和正则表达式

时间:2018-07-19 17:41:15

标签: regex sed

我正在运行linux bash脚本。在/gpx/trk/name=MyTrack1这样的粗线中,我只想在=之后保留行尾。

我正在努力了解为什么以下 sed 命令不能按我预期的那样工作:

echo "/gpx/trk/name=MyTrack1" | sed -e "s/^*=//" 

(我也尝试过)

echo "/gpx/trk/name=MyTrack1" | sed -e "s/^*\=//" 

返回总是/gpx/trk/name=MyTrack1而不是MyTrack1

4 个答案:

答案 0 :(得分:4)

如果这是您唯一关心的结构,则是一种更简单的方法:

echo "/gpx/trk/name=MyTrack1" | cut -d = -f 2

答案 1 :(得分:3)

只需尝试:

echo "/gpx/trk/name=MyTrack1" | sed 's/.*=//'

解决方案2nd: 和另一个sed

echo "/gpx/trk/name=MyTrack1" | sed 's/\(.*=\)\(.*\)/\2/'

说明: :根据OP的要求,请在此处添加此代码的说明:

s:表示告诉sed进行替换操作。

\(.*=\):在内存中创建第一位以保持此正则表达式的值,该值指示sed从开始到直到=都将第一位的内容保持在内存中,因此文本/gpx/trk/name=将位于1处。

\(.*\):在内存中为sed创建第二个位置,告诉它现在保留所有内容(在第一个匹配之后,因此它将在=之后开始)并在其中具有价值为MyTrack1

/\2/:现在告诉sed用仅第二个内存占位符MyTrack1

替换整行

解决方案第三: 或考虑到您的Input_file与所示示例相同,使用awk

echo "/gpx/trk/name=MyTrack1" | awk -F'=' '{print $2}'

解决方案4: :使用awk的{​​{1}}。

match

答案 2 :(得分:2)

//#include <algorithm>
#include <iostream>
#include <random>
//#include <vector>

using namespace std;

int main() {
  vector<int>::const_iterator iter;

  cout << "Creating a list of scores.";
  vector<int> scores;
  scores.emplace_back(1500);
  scores.emplace_back(3500);
  scores.emplace_back(7500);

  cout << "\nHigh Scores:\n";

  for (iter = scores.begin(); iter!=scores.end(); iter++) {
    cout << *iter << endl;
  }

  cout << "\nFinding a score.";
  int score;
  cout << "\nEnter a score to find: ";
  cin >> score;
  iter = find(scores.begin(), scores.end(), score);
  if (iter!=scores.end()) {
    cout << "Score found.\n";
  } else {
    cout << "Score not found.\n";
  }

  cout << "\nRandomising scores.";
  random_device rd;
  default_random_engine generator(rd());
  shuffle(scores.begin(), scores.end(), generator);
  cout << "\nHigh Scores:\n";
  for (iter = scores.begin(); iter!=scores.end(); iter++) {
    cout << *iter << endl;
  }

  cout << "\nSorting scores.";
  sort(scores.begin(), scores.end());
  cout << "\nHigh Scores:\n";
  for (iter = scores.begin(); iter!=scores.end(); iter++) {
    cout << *iter << endl;
  }

  return 0;
}

正则表达式$ echo "/gpx/trk/name=MyTrack1" | sed -e "s/^.*=//" MyTrack1 匹配字符串中最后一个^.*=之前的所有字符。

您的正则表达式=将与字符串^*=相匹配,例如字符串的开头。

*=

正则表达式中的$ echo "*=/gpx/trk/name=MyTrack1" | sed -e "s/^*=//" /gpx/trk/name=MyTrack1 字符通常会修改紧接的前一个表达式,以便可以匹配零个或多个。另一方面,当*出现在表达式的开头时,它与字符*匹配。

答案 3 :(得分:2)

不要让您脱离sed的轨道,但是仅使用Bash即可轻松实现:

$ echo "$s"
/gpx/trk/name=MyTrack1
$ echo "${s##*=}"
MyTrack1

##*=模式从字符串开头到最后一个=删除最大模式:

$ s="1=2=3=the rest"
$ echo "${s##*=}"
the rest

sed中的等效项是:

$ echo "$s" | sed -E 's/^.*=(.*)/\1/'
the rest

#*=将删除最小模式的地方:

$ echo "${s#*=}"
2=3=the rest

sed中:

$ echo "$s" | sed -E 's/^[^=]*=(.*)/\1/'
2=3=the rest

请注意,Bash字符串函数与sed正则表达式在*中的区别:

  1. Bash中的*(在这种情况下)就像是球状-本身表示“任何字符”
  2. 正则表达式中的*指的是先前的模式,对于“任何字符”,您都需要.*

Bash具有广泛的字符串处理功能。您可以在BashFAQ中了解有关Bash字符串模式的信息。