如何在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
答案 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在替换中使用它。