替换UNIX文件中第一行上的字符串

时间:2014-07-22 17:48:46

标签: unix awk sed grep

我想替换第一行中存在的字符串,尽管它也存在于文件的其余行中。我怎么能通过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 字符串。

3 个答案:

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