我想替换第一行中存在的字符串,尽管它也存在于文件的其余行中。我怎么能通过shell脚本来做到这一点?有人可以帮我这个。我的代码如下。我从文件中提取第一行,之后我不知道如何进行替换。任何帮助,将不胜感激。感谢。
伙计们 - 我想替换$ line中的字符串,并将新行写入同一位置的同一文件中。
代码:
while read line
do
if [[ $v_counter == 0 ]] then
echo "$line"
v_counter=$(($v_counter + 1));
fi
done < "$v_Full_File_Nm"
示例数据:
输入
BUXT_CMPID|MEDICAL_RECORD_NUM|FACILITY_ID|PATIENT_LAST_NAME|PATIENT_FIRST_NAME|HOME_ADDRESS_LINE_1|HOME_ADDRESS_LINE_2|HOME_CITY|HOME_STATE|HOME_ZIP|MOSAIC_CODE|MOSAIC_DESC|DRIVE_TIME| buxt_pt_apnd_20140624_head_5records.txt
100106086|5000120878|7141|HARRIS|NEDRA|6246 PARALLEL PKWY||KANSAS CITY|KS|66102|S71|Tough Times|2|buxt_pt_apnd_20140624_head_5records.txt
输出
BUXT_CMPID|MEDICAL_RECORD_NUM|FACILITY_ID|PATIENT_LAST_NAME|PATIENT_FIRST_NAME|HOME_ADDRESS_LINE_1|HOME_ADDRESS_LINE_2|HOME_CITY|HOME_STATE|HOME_ZIP|MOSAIC_CODE|MOSAIC_DESC|DRIVE_TIME| SRC_FILE_NM
100106086|5000120878|7141|HARRIS|NEDRA|6246 PARALLEL PKWY||KANSAS CITY|KS|66102|S71|Tough Times|2|buxt_pt_apnd_20140624_head_5records.txt
根据以上示例数据,我需要将 buxt_pt_apnd_20140624_head_5records.txt 替换为SRC_FILE_NAME 字符串。
答案 0 :(得分:6)
为什么不使用sed
?
sed -e '1s/fred/frog/' yourfile
会将fred
替换为第1行的frog
。
如果你的'string'是一个变量,你可以这样做以扩展变量:
sed -e "1s/$varA/$varB/" yourfile
如果您想这样做并更改文件,请在-i
之前添加-e
。
答案 1 :(得分:5)
awk -v old="string1" -v new="string2" '
NR==1 && (idx=index($0,old)) {
$0 = substr($0,1,idx-1) new substr($0,idx+length(old))
}
1' file > /usr/tmp/tmp$$ && mv /usr/tmp/tmp$$ file
只有当string1
显示在string2
的第一行时,上述内容才会将file
替换为index
。
发布的任何使用awk但不使用string1
的解决方案都不会起作用。对于使用sed发布的任何解决方案都是如此。原因是那些可以在RE上工作,而不是字符串,因此根据awk -v old="string1" -v new="string2" '
function strsub(old,new,tgt, idx) {
if ( idx = index(tgt,old) ) {
tgt = substr(tgt,1,idx-1) new substr(tgt,idx+length(old))
}
return tgt
}
NR==1 { $0 = strsub(old,new,$0) }
1' file
中存在的字符,字符串替换会表现得不合适。
看起来OP会使用sed RE替换解决方案,所以这只适用于其他任何想要替换字符串的人:如果你不想让它内联,那么这就是字符串替换函数的样子:
{{1}}
答案 2 :(得分:0)
bash解决方案:
file="afile.txt"
str="hello"
repl="goodbye"
IFS= read -r line < "$file"
line=${line/$str/$repl}
tmpfile="/usr/tmp/$file.$$.tmp"
{
echo "$line"
tail -n+2 "$file"
} > "$tmpfile" && mv "$tmpfile" "$file"
请注意,上面的$str
将被解释为“模式”(一种简单的正则表达式),其中*
匹配任意数量的任何字符,?
匹配任何单个字符,{ {1}}与括号中的任何一个字符匹配,[abc]
(或[^abc]
)匹配括号中的任何一个 字符。见Pattern-Matching