替换具有类似使用sed的模式的字符串

时间:2015-06-22 19:02:51

标签: regex linux bash replace sed

如何在sed中使用类似(。*)操作来搜索模式(例如:STRING。*)并将“*”附加到匹配的字符串的末尾。

以下是示例:

cat file1.txt 
MAC BOOK
MODERN MACHINE
MECHANICS
MOUNT
DISK
DATA INFORMATICS
cat file2.txt 
MAC
DATA
for line in $(cat file2.txt|uniq)
do
    sed -i "/$line.*/s/$line.*/$line.**/" file1.txt
done

预期产出:

cat file1.txt

MAC* BOOK
MODERN MACHINE*
MECHANICS
MOUNT
DISK
DATA* INFORMATICS

4 个答案:

答案 0 :(得分:3)

单行:

$ sed -r '/'"$(paste -sd'|' file2.txt)"'/s/$/*/' file1.txt
MAC*
MACHINE*
MECHANICS
MOUNT
DISK
DATA*

paste命令从file2创建正则表达式:

$ paste -sd'|' file2.txt
MAC|DATA

然后sed命令查找与此正则表达式匹配的文件行,并用星号替换行尾。

-i添加到sed命令以完成任务。

新输入的

更新

awk -v patt="$(paste -sd'|' file2.txt)" '{ 
    for (i=1; i<=NF; i++)
       if ($i ~ patt)
           $i = $i "*"
    print
}' file1.txt
MAC* BOOK
MODERN MACHINE*
MECHANICS
MOUNT
DISK
DATA* INFORMATICS

并编辑将输出保存回文件:

tmp=$(mktemp)
awk ... file1.txt > "$tmp" && mv "$tmp" file1.txt

或者,使用最新的GNU awk:

gawk -i inplace -v patt="$(paste -sd'|' file2.txt)" '{ 
    for (i=1; i<=NF; i++)
       if ($i ~ patt)
           $i = $i "*"
    print
}' file1.txt

答案 1 :(得分:1)

当你匹配时,你可以用*替换“行尾”:

for line in $(uniq file2.txt); do
    sed -i "/$line/s/\$/*/" file1.txt
done

虽然这只适用于GNU sed,并且它会在行中的任何位置匹配$line,所以希望这就是你所期望的

答案 2 :(得分:1)

awk更适合这个:

awk 'FNR==NR{a[$1];next} {for (i in a) if (index($1, i)) $0 = $0 "*"}1' file2.txt file1.txt
MAC*
MACHINE*
MECHANICS
MOUNT
DISK
DATA*

答案 3 :(得分:1)

我认为你在寻找的是:

for line in $(cat file2.txt|uniq)
do
    sed -i "s/\(${line}.*\)/\1\*/" file1.txt
done

您可以在sed搜索中使用()保存结果,使用\ 1在替换中使用它。