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

Tej*_*eja 3 unix awk grep sed

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

Mar*_*ell 6

为什么不用sed

sed -e '1s/fred/frog/' yourfile
Run Code Online (Sandbox Code Playgroud)

将替换fredfrog第1行.

如果你的'string'是一个变量,你可以这样做以扩展变量:

sed -e "1s/$varA/$varB/" yourfile
Run Code Online (Sandbox Code Playgroud)

如果您想在原地进行操作并更改文件,-i请先添加-e.

  • 这不会替换字符串,它会替换正则表达式,这是一种非常不同的情况. (2认同)
  • 我认为我们不应该猜测OPs字符串可能包含或不包含的字符.到目前为止发布的一个示例包含RE元字符.相当于awk中的上述sed脚本将是'awk'NR == 1 {sub(/ fred /,"frog")} 1'yourfile`,它不比sed解决方案复杂,你只是不会写在awk中,因为与不能支持字符串的sed不同,你可以选择awk实际处理字符串,因此不依赖于希望输入数据永远不会包含RE元字符.如果有一个简短的语法,但没有,那将是很好的. (2认同)
  • ...只是要注意除了各种RE元字符(.,*,+,?,(,),[,],|,\,在某些位置等),你的"字符串"不能包含"/现在也是. (2认同)

Ed *_*ton 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
Run Code Online (Sandbox Code Playgroud)

以上将取代string1string2只当它出现在第一线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)