在每一行上用一个值替换另一个值

时间:2015-07-10 13:49:04

标签: 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 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值?

我使用正则表达式和 sed 的组合完成了这项任务,但我认为有一个更简单的解决方案,这就是我所要求的。我做了以下事情:

  1. 使用正则表达式将srcDocId替换为id:
  2. 正则表达式:(id='.*?') (srcDocId='.*?')

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

    此正则表达式的示例可在此处找到:https://regex101.com/r/fS2qT0/1

    1. 使用正则表达式替换输出并运行 sed ,将id=的第二次替换为srcDocId=
    2. Sed:sed 's/id=/srcDocId=/2' input.txt > output.txt

2 个答案:

答案 0 :(得分:2)

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

id='(.*?)' srcDocId='(.*?)'

id='$2' srcDocId='$1'作为替代。

这是demo

答案 1 :(得分:2)

sed中没有非贪婪的量词。

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

如果你想交换,那就试试吧,

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