脚本应该读取路径中的每个文件并替换每一行中的字符串。如何在同一路径中迭代10个diff输入文件名时创建临时文件和mv替换 请咨询
SunOS 5.10
FILES=/export/home/*.txt
for f in $FILES
do
echo "Processing $f file..."
cat $f | awk 'BEGIN {FS="|"; OFS="|"} {$8=substr($8, 1, 6)"XXXXXXXXXX\""; print}'
done
输入文件
"2013-04-30"|"X"|"0000628"|"15000231"|"1999-12-05"|"ST"|"2455525445552000"|"1111-11-11"|75.00|"XXE11111"|"224425"
"2013-04-30"|"Y"|"0000928"|"95000232"|"1999-12-05"|"VT"|"2455525445552000"|"1111-11-11"|95.00|"VVE11111"|"224425"
输出文件
"2013-04-30"|"X"|"0000628"|"15000231"|"1999-12-05"|"ST"|"245552xxxxxxxxxx"|"1111-11-11"|75.00|"XXE11111"|"224425"
"2013-04-30"|"Y"|"0000928"|"95000232"|"1999-12-05"|"VT"|"245552xxxxxxxxxx"|"1111-11-11"|95.00|"VVE11111"|"224425"
不确定如何使用此
cat $f | awk 'BEGIN {FS="|"; OFS="|"} {$8=substr($8, 1, 6)"XXXXXXXXXX\""; print}' $f > tmp.txt && mv tmp.txt $f
答案 0 :(得分:0)
要实现您期望的最终结果,您可以使用 ed 代替 awk 。
FILES=/export/home/*.txt
for f in $FILES; do
echo "Processing ${f} file..."
ed "${f}" <<EOF
% s/\([0-9]\{6\}\)[0-9]\{10\}/\1xxxxxxxxxx/
w
q
EOF
done
这需要更少的步骤(即命令调用),因为您没有创建临时文件并移动它。相反,您正在使用所需的更改编辑文件,然后关闭它。
% means "operate on every line" (don't worry about lines that don't match) s means "perform a substitution" -- /[pattern]/[replacement]/ w means write q means quit EOF closes out the "here document"
希望有所帮助。
编辑注意:Charles Duffy指出 ed $ {f} 会因文件名中包含空格而失败,并且 ed “$ {f}” 不会受到这种特殊缺陷的影响。这是真的。 然而,上面的 for 循环可能会分裂到文件名中的任何空格。你可以设置 IFS ( IFS='\n'
)来克服KSH,BASH,MKSH,ASH和DASH的这个限制。在ZSH中(取决于您的版本),您可能需要设置SH_WORD_SPLIT。作为替代方案,您可以从 for 循环更改为而循环读取:
FILES=/export/home/*.txt
ls ${FILES} | while read f; do
echo "Processing ${f} file..."
ed "${f}" <<-EOF
% s/\([0-9]\{6\}\)[0-9]\{10\}/\1xxxxxxxxxx/
w
q
EOF
done
击> <击> 撞击>
编辑注意:我上面的错误陈述受到了破坏,但仍然用于历史目的。请参阅Charles Duffy(下文)的评论以获得澄清。