使用 bash 或 awk 替换字符串的一部分

use bash or awk to replace part of a string

我在文件中有以下示例行:

sweet_25 2 0 4
guy_guy 2 4 6
ging_ging 0 0 3
moat_2 0 1 0

我想处理文件并得到以下输出:

sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0

请注意第 2 行和第 3 行发生了所需的效果 - 在出现此模式的行上删除了下划线和文本后面的文本。

我没有成功完成以下操作:

sed -E 's/([a-zA-Z])_[a-zA-Z]//g' file.txt >out.txt

任何 bash 或 awk 的建议都是 welcome.Thanks

你可以做的更简单,像这样:

sed -E 's/_[a-zA-Z]+//' file.txt >out.txt

这只是将下划线后跟任意数量的字母字符替换为空。

使用您显示的示例,请尝试以下 awk 代码。

awk 'split(,arr,"_") && arr[1] == arr[2]{=arr[1]} 1' Input_file

解释: 简单的解释是,使用 awksplit 函数拆分第一个字段进入一个名为 arr 的数组,其中包含分隔符 _ 然后检查条件,如果 arr 的第一个元素是 EQAUL 到 arr 的第二个元素,然后只将 arr 的第一个元素保存到第一个字段(</code>)和通过提及 <code>1 打印 edited/non-edited 行。

$ awk 'NR~/^[23]$/{sub(/_[^ ]+/,"")} 1' file
sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0

如果要替换下划线后的整个单词,必须使用 [a-zA-Z]+ 重复字符 class 一次或多次,并在替换中使用 </code>。</p> <pre><code>sed -E 's/([a-zA-Z])_[a-zA-Z]+//g' file.txt >out.txt

如果下划线前后的单词应该相同,可以使用带反向引用的重复捕获组。

如果您只想在字符串的开头执行此操作,您可以将 ^ 添加到模式并在 sed 命令末尾省略 /g

sed -E 's/([a-zA-Z]+)(_)+//g' file.txt >out.txt

模式匹配:

  • ([a-zA-Z]+) 捕获 组 1,匹配 1 次或多次出现的字符 a-zA-Z
  • (_)+捕获组2,重复匹配_和组1捕获的相同文本

文件 out.txt 将包含:

sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0

我会做:

awk '~/[[:alpha:]]_[[:alpha:]]/{sub(/_.*/,"",)} 1' file

打印:

sweet_25 2 0 4
guy 2 4 6
ging 0 0 3
moat_2 0 1 0