我正在运行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
答案 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正则表达式在*
中的区别:
*
(在这种情况下)就像是球状-本身表示“任何字符” *
指的是先前的模式,对于“任何字符”,您都需要.*
Bash具有广泛的字符串处理功能。您可以在BashFAQ中了解有关Bash字符串模式的信息。