【问题标题】:Unix - sed command to replace only first string seperated by | in a fileUnix - sed 命令仅替换由 | 分隔的第一个字符串在一个文件中
【发布时间】:2020-09-29 11:17:36
【问题描述】:

我需要帮助来替换文件中 n 行中的第一个字符串和第一个字符串。

格式如下:

Str1|str2|str3|str4|str5||

这是文件的格式,我只需要替换所有行中的 str1 并保持其余部分不变。

我试过了

sed -i “s#.*|||||#Test|||||#g” filename.txt

这会将第一个文本替换为“Test”,这很好,但将其余文本替换为 |||||

有什么帮助吗?

【问题讨论】:

  • 不要在 shell 命令中使用花引号。
  • 请添加更多示例行并完成该示例的预期输出,是所有行上的 str1 还是不同的东西?

标签: linux unix sed replace


【解决方案1】:
awk -F\| -v OFS=\| '$1="test";1' filename

输入文件:

Str1|str2|str3|str4|str5||

生产:

test|str2|str3|str4|str5||

注意:这会写入标准输出。如果您想进行就地编辑并使用最新版本的 GNU awk,则有一个 -i 选项,否则只需写入一个临时文件并重命名它:

filename=my_input_file
tmp_file=my_tmp_file
awk -F\| -v OFS=\| '$1="test";1' $filename > $tmp_file && mv $tmp_file $filename

【讨论】:

  • 谢谢Barmar...这太棒了...像魅力一样工作...你能向我解释整个命令吗..就像你说的那样匹配所有不是|你是怎么做到的。如果我必须为特定行或从第二行开始执行此操作,我该如何实现。
  • @user1969295 您的评论与它所附的答案不同。
【解决方案2】:

从行首开始匹配所有不是|的内容。

sed -i 's#^[^|]*#Test#' filename.txt

【讨论】:

    猜你喜欢
    • 2016-03-07
    • 1970-01-01
    • 2023-03-14
    • 2020-12-07
    • 2018-05-07
    • 2020-01-12
    • 2018-05-24
    • 2019-07-13
    • 2017-11-11
    相关资源
    最近更新 更多