Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将每行上的一个值替换为另一个值_Regex_String_Sed - Fatal编程技术网

Regex 将每行上的一个值替换为另一个值

Regex 将每行上的一个值替换为另一个值,regex,string,sed,Regex,String,Sed,给定以下从大得多的文件中提取的文本示例行: <document id='3316200' srcDocId='http://ecx.images-amazon.com/images/I/61A9A0fmN7L.jpg'</document> <document id='3306829' srcDocId='http://ecx.images-amazon.com/images/I/71sQDUoJbmL.jpg'</document> <document

给定以下从大得多的文件中提取的文本示例行:

<document id='3316200' srcDocId='http://ecx.images-amazon.com/images/I/61A9A0fmN7L.jpg'</document>
<document id='3306829' srcDocId='http://ecx.images-amazon.com/images/I/71sQDUoJbmL.jpg'</document>
<document id='2406251' srcDocId='http://ecx.images-amazon.com/images/I/71j7ISxAOdL.jpg'</document>
<document id='2534144' srcDocId='http://ecx.images-amazon.com/images/I/71VXMXcrg2L.jpg'</document>
<document id='3417415' srcDocId='http://ecx.images-amazon.com/images/I/71Ymoo32gVL.jpg'</document>
如何以编程方式将srcDocId值替换为每行上的id值

我已经使用regex和sed的组合完成了这个任务,但我认为有一个更简单的解决方案,这就是我要问的。我做了以下工作:

使用regex将srcDocId替换为id: Regex:id='.*?'srcDocId='.*'

正则表达式替换:$1$1

此正则表达式的示例可在此处找到:

获取regex replacement输出并运行sed将第二次出现的id=替换为srcDocId=:
Sed:Sed's/id=/srcDocId=/2'input.txt>output.txt

您可以使用以下正则表达式替换来交换值:

id='(.*?)' srcDocId='(.*?)'
以id='$2'srcDocId='$1'作为替换


这里有一个

sed中没有非贪婪量词

sed "s/id='\([^']*\)'[[:blank:]]\+srcDocId='[^']*'/id='\1' srcDocId='\1'/g" file
如果你想交换,那么试试这个

sed "s/id='\([^']*\)' srcDocId='\([^']*\)'/id='\2' srcDocId='\1'/g" file

非常感谢你的回答。工作完美。我将此标记为正确答案,因为它是最简单的。如果两个属性之间确实存在未知数量的空格,您可以使用id='.*?'+srcDocId='.'.'.'',或id='.'.'.'[[:blank:]]+srcDocId='.'.''?,替换为id='$3'$2srcDocId='$1'。谢谢您的回答。我试过了,效果很好。如果你是唯一的答案,我会把这个标记为正确的,但是因为你只能有一个答案标记为正确,你必须接受一次投票:@Stuart你在sed中试过另一个答案了吗?