我有一个文件目录myFiles/
和一个文本文件values.txt
,其中一列是要查找的值集,第二列是相应的替换值。
目标是将所有查找值实例(values.txt
的第一列)替换为位于values.txt
的所有文件中的相应替换值(myFiles/
的第二列)
例如......
values.txt
:
Hello Goodbye
快乐悲伤
运行该命令会在myFiles/
中的每个文件中将“Hello”的所有实例替换为“Goodbye”,并在myFiles/
的每个文件中将“Happy”的每个实例替换为“Sad” }。
我已尽可能多地尝试使用awk / sed等,因为我认为这是合乎逻辑的,但未能生成执行所需操作的命令。
感谢任何指导。谢谢!
答案 0 :(得分:1)
你可以用awk做你想做的事。
#! /usr/bin/awk -f
# snarf in first file, values.txt
FNR == NR {
subs[$1] = $2
next
}
# apply replacements to subsequent files
{
for( old in subs ) {
while( index(old, $0) ) {
start = index(old, $0)
len = length(old)
$0 = substr($0, start, len) subs[old] substr($0, start + len)
}
}
print
}
调用它时,将values.txt
作为要处理的第一个文件。
答案 1 :(得分:0)
选项一:
选项二:
调用
perl -p -i -e' s / from / to / g' dirname / * .txt
完成
第二个可能更容易编写,但更少的异常处理。 它被称为Perl PIE'它是一个相对着名的黑客,可以同时在很多文件中查找/替换。
答案 2 :(得分:0)
values.txt
sed
为每行代替myFiles/
目录中所有文件中的第2个单词注意:我已使用bash parameter expansion拆分行(${line% *}
等),假设values.txt
是空格分隔的2列文件。如果不是这种情况,您可以使用awk
或cut
分割该行。
while read -r line;do sed -i "s/${line#* }/${line% *}/g" myFiles/* # '-i' edits files in place and 'g' replaces all occurrences of patterns done < values.txt