我有一个标签分隔的文本文件,看起来像这样
1 283
28 316
128 288
有~2000行,其中第一列是我想要搜索的数字,第二列是我要替换的。这个搜索和替换我希望以递归方式在目录中对~400个文本文件进行预处理。
问题
使用Bash和/或Perl,最简单的方法是什么?
更新
我用它来测试
rm -fr /tmp/a
mkdir -p /tmp/a/1/2
echo -e "1\n28\n128\n2" > /tmp/a/f.ext
echo -e "1\n28\n128\n2" > /tmp/a/1/f.ext
echo -e "1\n28\n128\n2" > /tmp/a/1/2/f.ext
答案 0 :(得分:1)
bash中未经测试的解决方案:
awk '{print "old="$1" new="$2}' list.txt |\
while IFS= read line; do
declare $line
find /path -name '*.ext' -exec sed -i "s/\b$old\b/$new/" {} +
done
<强> UNTESTED 强>
答案 1 :(得分:1)
使用bash
它可以非常直接地完成您想要的操作。假设您拥有支持find
的{{1}}版本。如果没有...抱歉,请确保您的文件名不包含换行符。
-print0
正则表达式搜索/替换列表应如下所示:
#!/bin/bash
searchdir=/path/to/rescursive/search
regex=/path/to/regex/list
while IFS= read -r -d '' file; do
while IFS=$'\t' read -r var1 var2; do # extra var is terminator
if [[ $var1 ]]; then
echo " ( $var1 <- $var2 ) -> $file"
sed -i '' -E 's!'"$var1"'!'"$var2"'!g' "$file"
fi
done < "$regex" # input file
done < <(find "$searchdir" -name "*" -type f -print0)
答案 2 :(得分:0)
orr