使用正则表达式的Sed

使用正则表达式的Sed,sed,Sed,所以基本上我有一个1500个名字的原始列表,每个名字都有一个4位数的数字。我有另一个文件,其中包含1500个名字中的200个,还有一个新的4位数。我需要用这个新号码替换旧号码 我有一个文件original.txt,其中包含1500行文本,如下所示: names=updated.txt while read names do sed -E "s/$names[^AY.*]/$names/" original.txt done < "$names" 名称AYxxxxname2 AY

所以基本上我有一个1500个名字的原始列表,每个名字都有一个4位数的数字。我有另一个文件,其中包含1500个名字中的200个,还有一个新的4位数。我需要用这个新号码替换旧号码

我有一个文件original.txt,其中包含1500行文本,如下所示:

names=updated.txt
while read names
do
    sed  -E "s/$names[^AY.*]/$names/" original.txt
done < "$names"
名称AYxxxxname2 AYxxxxname3 AYxxxxname1500 AYxxxx

xxxx是一个4位数字,AY是一个字符串,显示在每个4位字符前面

我有一个更新的_file.txt,其中包含200行,如下所示:

names=updated.txt
while read names
do
    sed  -E "s/$names[^AY.*]/$names/" original.txt
done < "$names"
名称Ayzzzname 40 Ayzzzname 1300 Ayzzz

ZZZ是一个不同的4位数字。我需要用这个新号码(zzzz)替换原来的.txt中的旧号码(xxxx)

所以在原始文本中,我需要这是文本应该是什么样子:

名称AYZZZname2 AYxxxxname40 AYZZZname1300 AYZZZname1500 AYxxxx

我想做这样的事情:

names=updated.txt
while read names
do
    sed  -E "s/$names[^AY.*]/$names/" original.txt
done < "$names"
names=updated.txt
读名字的时候
做
sed-E“s/$names[^AY.*]/$names/”original.txt
完成<“$names”
尝试以下操作:

while read old new ; do
  sed -i "s/$old \([^ ]*\)/$new \1/" original.txt
done < updated_file.txt
读新旧时;做
sed-i“s/$old\([^]*\)/$new\1/”original.txt
完成

警告:使用
-i
选项,它将自动更新您的
原始.txt
文件。不要忘了先做一个备份副本。

您可以从更新字段生成一个sed脚本,如

sed 's:\(.*AY\)\d\+:/\1/s_.*_&_:' UPDATEFILE > SEDUPDATE.SED
然后在原始文件上运行生成的脚本,如:

sed -f SEDUPDATE.SED ORIGINAL_FILE

我已经对@ZoltBotykai的答案投了赞成票,但这里有一个小的修改,希望它能更精确、更便于携带

sed 's:\(.*AY\)[0-9][0-9]*$:s_^\1[0-9]*$_&_:' updated_file.txt |
sed -f - -i original.txt
如果您使用的是*BSD,我相信您需要在
-I
选项中添加一个空参数才能使其工作。测试时删除此选项,以便在屏幕上而不是在目标文件中看到生成的输出

我稍微收紧了正则表达式,并将
\d\+
(这是一个最新的Perl扩展,用于“最近”的进化尺度)更改为甚至有望在HP-UX等平台上工作的内容

另一方面,一些古老的
sed
实现不支持带破折号的
-f
选项从标准输入读取生成的脚本;然后,您需要恢复到将生成的脚本存储在临时文件中


如果实际数据包含下划线,则必须在生成的脚本中使用不同的分隔符。
s
命令后的字符可以是任何字符,但在替换正则表达式或替换文本中不能出现分隔符(无引号)。

我想没有人回答,因为不清楚您喜欢做什么。就文件包含的内容给出更好的例子。嗯?你不做一个循环。考虑编辑你的帖子,包括简单的样本输入文件,用最少的最小值来描述所有的情况,并给出输入所需的输出。请不要发表评论,使用编辑框左上角的
{}
格式工具(您似乎已经知道)。祝你好运。请注意,对于大型文件,这可能会非常慢,因为它会打开(原始)文件(并搜索/搜索)更新的_文件中的每一行。@ZsoltBotykai确实如此,但不需要创建临时
sed
脚本。一切都取决于文件的大小:-)。我在尝试运行脚本时遇到此错误:gsed:-e expression#1,char 104:unknown option to`s'我将分隔符从/交换到|,但仍然得到相同的错误。用临时文件交换多个输入?你不可能是认真的。我…哦…嗯…哦…我从来没用过,但它看起来很聪明。我终于明白了,但也许你能解释一下它对其他人是如何起作用的?不管怎样,这对我来说是一种提升。如果你能解释一下这是如何工作的,那就太棒了。我把它累坏了,它根本没有修改原始文件。添加一个
-I
选项,让
sed
修改文件。否则,它将把修改后的文件打印到标准输出。如果您的
sed
支持
-f-
,则不需要临时文件。@tripleee它打印出来的输出不正确。如果我使用-f选项,它会打印到终端。它重复打印一行,其中数字已正确更新,但缺少名称的第一个字符。如果我通过-I选项,我得到/gsed:-e表达式#1,char 1:unknown命令:`S'。