我想替换第一行中存在的字符串,尽管它也存在于文件的其余行中.我怎么能通过shell脚本来做到这一点?有人可以帮我这个.我的代码如下.我从文件中提取第一行,之后我不知道如何进行替换.任何帮助,将不胜感激.谢谢.
伙计们 - 我想替换$ line中的字符串,并将新行写入同一位置的同一文件中.
码:
while read line
do
if [[ $v_counter == 0 ]] then
echo "$line"
v_counter=$(($v_counter + 1));
fi
done < "$v_Full_File_Nm"
Run Code Online (Sandbox Code Playgroud)
样本数据:
输入
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
Run Code Online (Sandbox Code Playgroud)
产量
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
Run Code Online (Sandbox Code Playgroud)
从上面的示例数据我需要用SRC_FILE_NAME字符串替换buxt_pt_apnd_20140624_head_5records.txt .
为什么不用sed
?
sed -e '1s/fred/frog/' yourfile
Run Code Online (Sandbox Code Playgroud)
将替换fred
为frog
第1行.
如果你的'string'是一个变量,你可以这样做以扩展变量:
sed -e "1s/$varA/$varB/" yourfile
Run Code Online (Sandbox Code Playgroud)
如果您想在原地进行操作并更改文件,-i
请先添加-e
.
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
Run Code Online (Sandbox Code Playgroud)
以上将取代string1
以string2
只当它出现在第一线file
.
发布的任何使用awk但不使用的解决方案index
通常都不起作用.对于使用sed发布的任何解决方案都是如此.原因是那些可以在RE上工作,而不是字符串,因此根据字符的存在而对字符串替换表现不理想string1
.
看起来OP使用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
Run Code Online (Sandbox Code Playgroud)