在许多文件上搜索和替换txt文件?

时间:2015-02-27 17:55:32

标签: linux bash perl

我有一个标签分隔的文本文件,看起来像这样

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

3 个答案:

答案 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