使用 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
解释: 简单的解释是,使用 awk
的 split
函数拆分第一个字段进入一个名为 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
我在文件中有以下示例行:
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
解释: 简单的解释是,使用 awk
的 split
函数拆分第一个字段进入一个名为 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